Java 专题(并发编程之线程池状态)

Java 线程池五种生命周期状态详解

Java java.util.concurrent.ThreadPoolExecutor 为基准,结合源码与运行模型,系统梳理线程池的 5 个枚举状态及其转换条件、可见行为与监控方式。


一、状态总览表

枚举值 数值 中文描述 是否接受新任务 是否处理队列剩余任务
RUNNING -1 运行中
SHUTDOWN 0 关闭中
STOP 1 停止中
TIDYING 2 整理中
TERMINATED 3 已终止

状态值保存在 ThreadPoolExecutorctl 原子整数的高 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/
作者
JunCCore
发布于
2025年7月19日
许可协议
BY-JUNCCORE