java 线程池中的状态转换
需要表示2种类型的状态, 1种是线程池是否在运行中, 1种是线程池中的有效线程数目.
java源代码中, 并不使用2个变量来分别表示上面的状态, 而是使用1个整数来表示. 为此, 线程池限制了最大的线程数目为 (2^29)-1
而不是 (2^31)-1
. 这样做的目的是使代码更快, 更简单.
线程有以下的状态:
- RUNNING: 接受新的任务并处理队列中的任务
- SHUTDOWN: 不接受新的任务,但是继续处理队列中的任务
- STOP: 不接受新的任务,也不处理队列中的任务,并中断当前的任务
- TIDYING: 所有的任务都停止, workerCount 为 0 , 线程转换为 TIDYING 状态, 将会执行
terminated()
钩子方法 - TERMINATED:
terminated()
调用完成
为了比较状态, 数字顺序是有用的. runState 是单调递增的:
RUNNING
->SHUTDOWN
调用shutdown()
的时候触发, 可能隐式地在 finally 块中调用- (
RUNNING
orSHUTDOWN
) ->STOP
调用shutdownNow()
的时候触发 SHUTDOWN
->TIDYING
当 任务队列 和 线程池 都为空的时候STOP
->TIDYING
当 线程池为空的时候TIDYING
->TERMINATED