网上有一篇讲的非常好的分析文章:https://blog.csdn.net/qq_19431333/article/details/59030892
我这里记录下重难点:
1 ctl:
ctl维护两个概念上的参数:workCount和runState(线程池的状态)。为了将状态和数量放在一起,所以高3位用于表示表示状态,低29位表示数量。
2 状态值
COUNT_BITS = Integer.SIZE - 3; // = 29
CAPACITY = (1 << COUNT_BITS) - 1; // = 0001 1111 1111 1111 1111 ... 1111
RUNNING = -1 << COUNT_BITS; // = 1110 0000 0000 0000 0000 .... 0000
SHUTDOWN = 0 << COUNT_BITS; // = 0000 0000 0000 0000 0000 .... 0000
STOP = 1 << COUNT_BITS; // = 0010 0000 0000 0000 0000 .... 0000
TIDYING = 2 << COUNT_BITS; // = 0100 0000 0000 0000 0000 ..... 0000
TERMINATED = 3 << COUNT_BITS; // = 0110 0000 0000 0000 0000 .... 0000
TERMINATED >TIDYING >STOP >SHUTDOWN >RUNNING
RUNNING
接受新任务并且处理已经进入队列的任务
SHUTDOWN
不接受新任务,但是处理已经进入队列的任务
STOP
不接受新任务,不处理已经进入队列的任务,并且中断正在执行的任务
TIDYING
所有任务执行完成,workerCount为0。线程转到了状态TIDYING会执行terminated()钩子方法
TERMINATED
terminated()已经执行完成
网友评论