java线程池是严格定义、不可逆流转的五态机,状态决定行为:running接收并执行任务;shutdown拒新任务但执行完队列任务;stop拒新任务、清空队列并中断运行线程;tidying表示任务结束且线程数为0,触发terminated();terminated为最终状态。

Java线程池的状态不是简单的开关,而是一套严格定义、不可逆流转的五态机。理解它,关键在于抓住“状态决定行为”这一核心——每种状态下,线程池对新任务、队列任务、工作线程的处理逻辑完全不同。
RUNNING:唯一能接收和执行任务的状态
这是线程池的初始且活跃状态。只有在此状态下,execute() 才会接受新任务,并将任务加入队列或直接交给空闲线程执行。
- 新提交的任务会被正常接收并尝试执行
- 阻塞队列中已有的任务会持续被工作线程拉取执行
- 当线程数未达核心线程数时,可动态创建新工作线程
SHUTDOWN 与 STOP:两种关闭路径的本质区别
两者都拒绝新任务,但对待“存量任务”的态度截然不同。
- SHUTDOWN:温和收尾。调用 shutdown() 后,线程池停止接收新任务,但会坚持把队列里所有已排队的任务执行完,再逐步回收空闲线程
- STOP:立即终止。调用 shutdownNow() 后,不仅拒收新任务,还会尝试清空队列(返回未执行任务列表),并调用 interrupt() 中断所有正在运行的工作线程
TIDYING 与 TERMINATED:终结前的最后两步
这两个状态是自动触发的过渡阶段,开发者通常不主动干预,但需知晓其含义以正确判断线程池是否真正关闭。
- TIDYING:表示所有任务已结束、所有工作线程已销毁(线程数为0)、队列为空。此时线程池会自动调用 terminated() 钩子方法
- TERMINATED:钩子方法执行完毕后的最终状态。线程池资源彻底释放,ctl 值固定为 TERMINATED,无法再恢复或复用
状态流转不可逆,且由 ctl 原子变量统一控制
线程池用一个 AtomicInteger ctl 同时编码状态和线程数量:高3位存状态(RUNNING=111…, SHUTDOWN=000…),低29位存工作线程数。所有状态变更(如 shutdown())都是通过 CAS 操作更新 ctl 实现的,保证了状态切换的原子性与线程安全性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











