持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
线程池使用SynchronousQueue队列和线程池最大线程数关系
运行类代码如下:
public class SynchronousQueueRun {
public static void main(String[] args) {
FirstRunnable firstRunnable = new FirstRunnable();
SynchronousQueue<Runnable> synchronousQueue = new SynchronousQueue<>();
System.out.println("队列个数:"+synchronousQueue.size());
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 3, 5, TimeUnit.SECONDS, arrayBlockingQueue);
for (int i = 0; i < 3 ; i++) {
threadPoolExecutor.execute(firstRunnable);
}
System.out.println("线程池正在执行的任务个数:"+threadPoolExecutor.getPoolSize());
System.out.println("线程池使用的队列个数:"+synchronousQueue.size());
}
}
运行结果如下:
队列个数:0
线程池正在执行的任务个数:3
线程池使用的队列个数:0
pool-1-thread-3 开始时间:14:55:31
pool-1-thread-1 开始时间:14:55:31
pool-1-thread-2 开始时间:14:55:31
pool-1-thread-2 结束时间:14:55:32
pool-1-thread-3 结束时间:14:55:32
pool-1-thread-1 结束时间:14:55:32
从运行结果看出线程池直接执行3个任务。
修改运行类代码如下:
运行结果如下:
队列个数:0
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.ozx.concurrentprogram.executor.service.FirstRunnable@29444d75 rejected from java.util.concurrent.ThreadPoolExecutor@44e81672[Running, pool size = 3, active threads = 3, queued tasks = 0, 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.SynchronousQueueRun.main(SynchronousQueueRun.java:22)
pool-1-thread-1 开始时间:14:58:36
pool-1-thread-3 开始时间:14:58:36
pool-1-thread-2 开始时间:14:58:36
pool-1-thread-2 结束时间:14:58:37
pool-1-thread-3 结束时间:14:58:37
pool-1-thread-1 结束时间:14:58:37
从运行结果看出线程池直接执行3个任务,但是有1个任务被拒绝了,因为线程数已经超过max值。
线程池ThreadPoolExecutor的拒绝策略
线程池中的线程资源全部被占用时,对新添加的Task任务有不同的处理策略,在默认的情况下,ThreadPoolExecutor类中有4种不同的处理方式。