threadpoolexecutor的五种状态严格单向递增:running→shutdown/stop→tidying→terminated;running可接收任务,shutdown()平滑关闭进shutdown,shutdownnow()强制关闭进stop,任务全终止且线程数为0时进tidying并调用terminated(),完成后转terminated。

Java中ThreadPoolExecutor的五种生命周期状态不是随意变化的,而是严格遵循单向递增、不可逆的流转规则。理解这五种状态及其转换条件,是正确使用线程池、实现优雅关闭和排查运行问题的关键。
RUNNING:线程池的默认活跃态
线程池一创建就处于RUNNING状态,此时它完全可用:
– 接收新提交的任务
– 执行阻塞队列中已排队的任务
– 按需创建核心线程或非核心线程(取决于队列是否满、线程数是否达上限)
只要没调用任何关闭方法,线程池会一直保持这个状态。
SHUTDOWN 与 STOP:两种关闭路径的起点
关闭动作由两个关键方法触发,对应不同行为:
– shutdown():平滑关闭。状态从RUNNING → SHUTDOWN。此后拒绝新任务,但继续消费队列中已有任务,直到全部完成。
– shutdownNow():强制关闭。状态从RUNNING → STOP。立即拒绝新任务,清空队列,并尝试中断所有正在执行的Worker线程。
TIDYING 与 TERMINATED:清理与终结阶段
当线程池满足两个条件时,自动进入TIDYING:
– 所有任务(包括队列中的和正在执行的)均已终止
– 工作线程数量为0
此时会调用protected void terminated()钩子方法(默认为空)。该方法执行完毕后,状态变为TERMINATED——线程池彻底死亡,不可再使用。
状态流转不可逆,且编码高度紧凑
ThreadPoolExecutor用一个AtomicInteger(ctl)同时存储状态和工作线程数:
– 高3位表示状态(RUNNING=-1– 低29位表示当前活跃Worker数
这种设计让状态检查和线程计数原子化,避免锁竞争,也决定了状态只能从小到大推进,比如SHUTDOWN无法退回RUNNING,STOP也无法降级为SHUTDOWN。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











