【并发编程】- 线程池使用方法getCompletedTaskCount()获取已执行完成的任务数

429 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

线程池使用方法getCompletedTaskCount()获取已执行完成的任务数

线程池获取已执行完成的任务数,线程执行代码如下:

public class FirstRunnable implements Runnable {


    @Override
    public void run() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
        try {
            System.out.println(Thread.currentThread().getName() +"  开始时间:"+simpleDateFormat.format(new Date()));
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() +"  结束时间:"+simpleDateFormat.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行类代码如下:

public class GetCompletedTaskCountRun {
    public static void main(String[] args) {
        FirstRunnable firstRunnable = new FirstRunnable();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 2, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
        for (int i = 0; i < 6; i++) {
            threadPoolExecutor.execute(firstRunnable);
        }
        try {
            Thread.sleep(1000);
            System.out.println("已执行完成的任务数:"+threadPoolExecutor.getCompletedTaskCount());
            Thread.sleep(1000);
            System.out.println("已执行完成的任务数:"+threadPoolExecutor.getCompletedTaskCount());
            Thread.sleep(1000);
            System.out.println("已执行完成的任务数:"+threadPoolExecutor.getCompletedTaskCount());
            Thread.sleep(1000);
            System.out.println("已执行完成的任务数:"+threadPoolExecutor.getCompletedTaskCount());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

运行结果如下:

pool-1-thread-2  开始时间:16:34:15
pool-1-thread-1  开始时间:16:34:15
已执行完成的任务数:0
pool-1-thread-1  结束时间:16:34:16
pool-1-thread-1  开始时间:16:34:16
pool-1-thread-2  结束时间:16:34:16
pool-1-thread-2  开始时间:16:34:16
已执行完成的任务数:2
pool-1-thread-2  结束时间:16:34:17
pool-1-thread-1  结束时间:16:34:17
pool-1-thread-2  开始时间:16:34:17
pool-1-thread-1  开始时间:16:34:17
已执行完成的任务数:4
pool-1-thread-2  结束时间:16:34:18
pool-1-thread-1  结束时间:16:34:18
已执行完成的任务数:6

从运行结果看出方法getCompletedTaskCount()的作用是取得已经执行完成的任务数。

线程池3种队列结合线程池最大线程数的关系

在使用ThreadPoolExecutor线程池中年,常使用3种队列有ArrayBlockingQueue、LinkedBlockingDeque和SynchronousQueue。而ArrayBlockingQueue和LinkedBlockingDeque队列可指定队列存储元素的多少。