threadpoolexecutor 是一个状态驱动、队列协同、线程受控的工作流引擎,核心是用 atomicinteger 类型的 ctl 变量高3位编码运行状态、低29位记录线程数,实现无锁判断与原子状态跃迁。

ThreadPoolExecutor 不是简单地“起几个线程跑任务”,而是一个状态驱动、队列协同、线程受控的完整工作流引擎。它的底层架构围绕“任务提交→线程调度→执行闭环→状态治理”四层展开,核心在于用一个 AtomicInteger 原子变量(ctl)同时编码线程数量与运行状态,实现高效无锁判断和原子跃迁。
ctl 变量:状态与数量的二进制共存设计
线程池所有关键决策都依赖 ctl 的高3位(状态)和低29位(线程数)。比如 RUNNING = -1 ,即二进制 <code>111 后跟29个0;SHUTDOWN = 0 对应 000 开头。这种设计让状态检查(如 isRunning())只需一次位运算,无需加锁——这是高性能调度的底层基石。
任务提交 execute() 的三级分流逻辑
每次调用 execute(),实际触发一套严格优先级的分流机制:
- 若当前线程数 :直接创建新核心线程执行任务,不入队;
- 否则尝试 offer 到 workQueue:成功则等待空闲线程拉取;失败(如队列满)进入下一步;
- 若线程数 :创建非核心线程执行该任务;
- 否则触发 拒绝策略,由
handler.rejectedExecution()处理。
这个流程不是线性顺序,而是带条件重试的原子协作——例如入队成功后发现线程数为0,会立即补一个空闲线程保障队列不积压。
Worker 线程:绑定任务、隔离中断、自主循环
每个 Worker 是一个 AQS 同步器封装的 Runnable,它持有一个独占锁(防止被重复 interrupt),并运行 runWorker() 主循环:
- 持续调用
getTask()从队列取任务(阻塞或超时); - 取到任务就执行
beforeExecute()→task.run()→afterExecute(); - 若
getTask()返回 null(如线程池关闭、空闲超时、队列已枯竭),Worker 自行退出并回收; - 整个过程不依赖外部调度器,Worker 完全自治,仅通过
ctl和队列做协同。
状态机驱动的生命周期管理
五种状态(RUNNING → SHUTDOWN → STOP → TIDYING → TERMINATED)不是枚举常量,而是可原子跃迁的控制信号:
-
shutdown():设状态为 SHUTDOWN,不再接收新任务,但继续处理队列中已有任务; -
shutdownNow():设状态为 STOP,中断所有正在运行的 Worker,并清空队列; - 当所有 Worker 终止且队列为空时,自动跃迁至 TIDYING,再执行
terminated()钩子,最终变为 TERMINATED。
状态变更全部通过 CAS 操作完成,避免全局锁竞争,确保高并发下生命周期操作的强一致性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











