[并发编程]ThreadPoolExecutor源码中的ctl

网上有一篇讲的非常好的分析文章: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()已经执行完成

你可能感兴趣的:([并发编程]ThreadPoolExecutor源码中的ctl)