Java线程池ThreadPoolExecutor的状态
Java线程池ThreadPoolExecutor的状态
ThreadPoolExecutor使用一个AtomicInteger变量(ctl)同时保存线程池的运行状态(runState)和工作线程数(workerCount),其中高3位表示状态,低29位表示工作线程数。
线程池的5种状态
-
RUNNING(运行状态)
- 状态值:111(最高3位)
- 特点:
- 可以接收新任务
- 可以处理队列中的任务
- 这是线程池的初始状态,正常工作时的状态
-
SHUTDOWN(关闭状态)
- 状态值:000
- 特点:
- 不会接收新任务
- 但会处理队列中已存在的任务
- 通过调用shutdown()方法进入此状态
-
STOP(停止状态)
- 状态值:001
- 特点:
- 不会接收新任务
- 不会处理队列中的任务
- 会中断正在执行的任务
- 通过调用shutdownNow()方法进入此状态
-
TIDYING(整理状态)
- 状态值:010
- 特点:
- 所有任务已终止
- workerCount为0
- 线程池即将执行terminated()钩子方法
- 这是过渡状态,自动进入
-
TERMINATED(终止状态)
- 状态值:011
- 特点:
- terminated()方法已完成
- 线程池完全终止
状态转换流程
RUNNING -> SHUTDOWN(调用shutdown())(RUNNING或SHUTDOWN) -> STOP(调用shutdownNow())
SHUTDOWN -> TIDYING(队列和池都为空)
STOP -> TIDYING(池为空)
TIDYING -> TERMINATED(terminated()执行完毕)
状态判断方法
ThreadPoolExecutor提供了几个方法来判断状态:
isShutdown() // 返回true如果状态不是RUNNING
isTerminating() // 返回true如果状态是SHUTDOWN或STOP
isTerminated() // 返回true如果状态是TERMINATED
状态的实际应用
- 当提交新任务时,线程池会检查状态是否为RUNNING
- 工作线程在执行任务前会检查线程池状态
- 状态决定了如何处理队列中的任务和中断信号
理解这些状态对于正确使用线程池和诊断线程池问题非常重要,特别是在处理线程池关闭和任务拒绝策略时。