java线程池生命周期有running、shutdown、stop、tidying、terminated五种单向递增状态;ctl变量高3位存运行状态,低29位存活跃线程数;running是唯一接收新任务的状态;shutdown()停收新任务但处理队列,shutdownnow()则清空队列并中断线程;tidying需任务全终止且workercount为0,随后调用terminated()钩子,最终转为terminated。

Java线程池的生命周期由 ThreadPoolExecutor 的五种内部状态严格控制,不是随意切换的,而是单向递增、不可逆的流转过程。理解这个流转逻辑,是写出健壮、可维护并发代码的关键。
状态本质:一个int值承载两种信息
线程池所有状态都存于一个名为 ctl 的 AtomicInteger 变量中:
- 高3位表示运行状态(runState),取值范围固定为 -1、0、1、2、3 对应五种状态
- 低29位记录当前活跃线程数(workerCount)
- 这种紧凑设计保证了状态检查与线程计数的原子性,也决定了状态只能向前推进,无法回退
RUNNING 是唯一活跃态,也是唯一能接收新任务的状态
线程池一创建就处于 RUNNING 状态:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 接受
execute()提交的新任务 - 从 workQueue 中持续拉取并执行已排队任务
- 按需创建核心线程或非核心线程(取决于队列是否满、当前线程数是否达上限)
- 只要没调用
shutdown()或shutdownNow(),它就一直保持 RUNNING
SHUTDOWN 和 STOP:两条关闭路径的起点
关闭动作由两个方法触发,行为截然不同:
-
shutdown()→ 状态变为 SHUTDOWN:拒绝新任务,但继续处理队列中剩余任务,直到全部完成 -
shutdownNow()→ 状态变为 STOP:立即拒绝新任务、清空队列,并尝试中断所有正在执行的 Worker 线程 - 注意:
shutdownNow()可以在 RUNNING 或 SHUTDOWN 状态下调用,都会跳转到 STOP
TIDYING 到 TERMINATED:终结前的最后两步
进入 TIDYING 需同时满足两个条件:
- 所有任务(包括队列中未执行和正在执行的)均已终止
- 工作线程数量 workerCount 为 0
- 此时自动调用
protected void terminated()钩子方法(默认为空,可重写用于资源清理) - 该方法执行完毕后,状态变为 TERMINATED,线程池彻底不可用
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










