【并发编程】- 线程池使用ArrayBlockingQueue和最大线程数的关系(二)

80 阅读2分钟

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

接着上一篇文章- 【并发编程】- 线程池使用ArrayBlockingQueue和最大线程数的关系

运行结果如下:

队列个数:0
线程池正在执行的任务个数:3
线程池使用的队列个数:2
pool-1-thread-3  开始时间:14:42:51
pool-1-thread-1  开始时间:14:42:51
pool-1-thread-2  开始时间:14:42:51
pool-1-thread-2  结束时间:14:42:52
pool-1-thread-2  开始时间:14:42:52
pool-1-thread-3  结束时间:14:42:52
pool-1-thread-1  结束时间:14:42:52
pool-1-thread-3  开始时间:14:42:52
pool-1-thread-3  结束时间:14:42:53
pool-1-thread-2  结束时间:14:42:53

从运行结果看出线程池正在运行的线程数为3,而ArrayBlockingQueue队列中存储元素的个数为2。

修改运行类代码如下:

public class ArrayBlockingQueueRun {
    public static void main(String[] args) {
        FirstRunnable firstRunnable = new FirstRunnable();
        ArrayBlockingQueue<Runnable> arrayBlockingQueue = new ArrayBlockingQueue<Runnable>(2);
        System.out.println("队列个数:"+arrayBlockingQueue.size());
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 3, 5, TimeUnit.SECONDS, arrayBlockingQueue);
        for (int i = 0; i < 6 ; i++) {
            threadPoolExecutor.execute(firstRunnable);
        }
        System.out.println("线程池正在执行的任务个数:"+threadPoolExecutor.getPoolSize());
        System.out.println("线程池使用的队列个数:"+arrayBlockingQueue.size());
    }
}

运行结果如下:

队列个数:0
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.ozx.concurrentprogram.executor.service.FirstRunnable@6fdb1f78 rejected from java.util.concurrent.ThreadPoolExecutor@1517365b[Running, pool size = 3, active threads = 3, queued tasks = 2, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.ozx.concurrentprogram.executor.controller.ArrayBlockingQueueRun.main(ArrayBlockingQueueRun.java:21)
pool-1-thread-1  开始时间:14:47:11
pool-1-thread-2  开始时间:14:47:11
pool-1-thread-3  开始时间:14:47:11
pool-1-thread-3  结束时间:14:47:12
pool-1-thread-1  结束时间:14:47:12
pool-1-thread-1  开始时间:14:47:12
pool-1-thread-2  结束时间:14:47:12
pool-1-thread-3  开始时间:14:47:12
pool-1-thread-3  结束时间:14:47:13
pool-1-thread-1  结束时间:14:47:13

从运行结果看出执行的任务超过线程池中最大线程数时,线程池执行了3个最大线程数的任务,放入队列2个任务,有1个任务被拒绝了。