线程池基础
- 线程池:Java中用于提升程序执行效率的并发编程技术。
- 核心线程数 (
corePoolSize
):线程池中最小线程数,空闲时不销毁。 - 最大线程数 (
maximumPoolSize
):线程池允许的最大线程数,等于核心线程数加临时线程数。
线程池执行流程
- 核心线程数判断:如果当前工作线程数小于核心线程数,新建线程执行任务。
- 任务队列判断:如果工作线程数超过核心线程数但任务队列未满,将任务加入队列。
- 最大线程数判断:如果任务队列已满且当前线程数小于最大线程数,新建线程执行任务。
- 执行拒绝策略:如果当前线程数达到最大线程数,执行拒绝策略。
核心线程数为0的特殊执行流程
- 预期行为:任务直接加入队列,不立即执行。
- 实际行为:任务加入队列后,线程池检查工作线程数,如果为0,会立即创建线程执行任务。
验证代码示例
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
0, // 核心线程数设置为0
10, // 最大线程数
1, TimeUnit.SECONDS, // 线程存活时间
new ArrayBlockingQueue<>(10) // 任务队列容量
);
threadPoolExecutor.execute(() -> {
System.out.println("www.javacn.site");
});
- 结果:任务被立即执行,与预期不符。
源码分析
- 源码显示,即使核心线程数为0,如果当前工作线程数为0,线程池也会创建线程执行任务。
总结
-
核心线程数设置为0时,线程池的行为可能出乎预期。
-
源码分析揭示了线程池在任务到来时,即使核心线程数为0,也会检查当前工作线程数,如果为0,会创建线程执行任务,确保任务得到及时处理。