Java 专题(并发编程之线程池状态)
Java 线程池五种生命周期状态详解
以 Java
java.util.concurrent.ThreadPoolExecutor
为基准,结合源码与运行模型,系统梳理线程池的 5 个枚举状态及其转换条件、可见行为与监控方式。
一、状态总览表
枚举值 | 数值 | 中文描述 | 是否接受新任务 | 是否处理队列剩余任务 |
---|---|---|---|---|
RUNNING |
-1 | 运行中 | ✅ | ✅ |
SHUTDOWN |
0 | 关闭中 | ❌ | ✅ |
STOP |
1 | 停止中 | ❌ | ❌ |
TIDYING |
2 | 整理中 | ❌ | ❌ |
TERMINATED |
3 | 已终止 | ❌ | ❌ |
状态值保存在
ThreadPoolExecutor
的ctl
原子整数的高 3 位;低 29 位记录工作线程数。
二、各状态详解
1. RUNNING
- 定义
线程池一旦创建即处于该状态。 - 行为
- 接收新提交任务
- 正常处理阻塞队列中的任务
- 进入条件
new ThreadPoolExecutor(...)
默认即为 RUNNING - 退出条件
- 调用
shutdown()
→ SHUTDOWN - 调用
shutdownNow()
→ STOP
- 调用
2. SHUTDOWN
- 定义
平滑关闭,不再接收新任务,但会执行完已提交任务(包括队列中等待的任务)。 - 触发 API
shutdown()
- 行为
- 拒绝新提交任务(抛
RejectedExecutionException
) - 继续消费队列直到为空
- 拒绝新提交任务(抛
- 退出条件
- 队列 & 线程数均为 0 → TIDYING
3. STOP
- 定义
立即关闭,不接收新任务,也不处理队列剩余任务,同时中断正在执行的任务。 - 触发 API
shutdownNow()
- 行为
- 拒绝新提交任务
- 清空队列,返回尚未执行的任务
List<Runnable>
- 对所有工作线程调用
Thread.interrupt()
- 退出条件
- 线程数为 0 → TIDYING
4. TIDYING
- 定义
过渡状态;所有任务已终止,线程数为 0,线程池即将进入 TERMINATED。 - 钩子回调
在此状态下会执行terminated()
空方法(用户可继承线程池重写)。 - 退出条件
terminated()
执行完毕 → TERMINATED
5. TERMINATED
- 定义
线程池生命周期终点。 - 行为
- 所有资源释放完毕
awaitTermination()
调用者被唤醒
- 监控方式
isTerminated()
返回true
- JMX /
ThreadPoolExecutor.toString()
输出状态为 TERMINATED
三、状态转换图
stateDiagram-v2
[*] --> RUNNING
RUNNING --> SHUTDOWN : shutdown()
RUNNING --> STOP : shutdownNow()
SHUTDOWN --> TIDYING : 队列 && 线程==0
STOP --> TIDYING : 线程==0
TIDYING --> TERMINATED : terminated() 完
TERMINATED --> [*]
Java 专题(并发编程之线程池状态)
http://example.com/2025/07/18/Java/JavaSummary03/