1. 线程池核心原理剖析
线程池作为Java并发编程的核心组件,本质上是一个生产者-消费者模型的实现。我们先拆解其核心构造参数:
java复制public ThreadPoolExecutor(
int corePoolSize, // 常驻核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 空闲线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 任务队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
)
1.1 线程生命周期管理机制
线程池通过ctl原子变量(高3位表示状态,低29位表示线程数)实现高效的状态管理。状态转换遵循以下路径:
- RUNNING:接收新任务并处理队列任务
- SHUTDOWN:不接收新任务,但处理队列任务
- STOP:不接收新任务,也不处理队列任务
- TIDYING:所有任务已终止,线程数为0
- TERMINATED:terminated()方法执行完成
关键点:状态转换不可逆,SHUTDOWN状态下提交新任务会触发拒绝策略
1.2 任务处理流程详解
- 任务提交时,优先创建核心线程处理(未达corePoolSize)
- 核心线程满后,任务进入阻塞队列
- 队列满后,创建非核心线程(不超过maximumPoolSize)
- 线程数达最大值且队列满时,触发拒绝策略
java复制// 简化版任务处理逻辑
if (workerCount < corePoolSize) {
addWorker(command, true); // 创建核心线程
} else if (workQueue.offer(command)) {
if (workerCount == 0) {
addWorker(null, false); // 保活线程
}
} else if (!addWorker(co
