ThreadPoolExecutor 类变量
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;
// Packing and unpacking ctl
private static int runStateOf(int c) { return c & ~CAPACITY; }
private static int workerCountOf(int c) { return c & CAPACITY; }
private static int ctlOf(int rs, int wc) { return rs | wc; }
AtomicInteger ctl
ctl
是一个AtomicInteger
修饰的变量,用来保存2个变量:
- workerCount: 线程池中活动线程的数量
- runState:线程池的运行状态
CAPACITY
表示这个类支持设置的最大线程数量,固定值ZZZZZ
workerCount
workerCount
占用低29位存线程数,workerCount
代表了线程池活动的线程数量,最小数量是0,最大的数量是(1 << COUNT_BITS) - 1
(536870911);
1 << COUNT_BITS :
00000000 00000000 00000000 00000001 --> 00100000 00000000 00000000 00000000
(1 << COUNT_BITS) - 1 :
00100000 00000000 00000000 00000000 --> 00011111 11111111 11111111 11111111
private static int workerCountOf(int c) { return c & CAPACITY; }
workerCountOf
方法是用从ctl
中解析出workerCount
的值来。由于CAPACITY
高3位是000
,ctl
的值与CAPACITY
做&
操作的时候,高3位将被舍弃;由于CAPACITY
低29位是全是1
,&
操作会保持原值,这样workerCount
的值就从ctl
中解析出来了。
runState
runState
占用高3位存线程状态,共有5个值:
RUNNING(-536870912)
:接受新任务,并处理队列任务SHUTDOWN(0)
: 不接受新任务,但会处理队列中的任务STOP(536870912)
: 不接受新任务,不会处理队列任务,中断正在处理的任务TIDYING(1073741824)
: 所有任务已结束,workerCount
为0,线程过渡到TIDYING
状态,将调用terminated()
方法TERMINATED(1610612736)
: terminated()方法已经完成
private static int runStateOf(int c) { return c & ~CAPACITY; }
runStateOf
方法的作用是解析出runState
的值。~CAPACITY
将反转CAPACITY
的值,也就是CAPACITY
的高3位全部为1,低29位全部为0。如此ctl & ~CAPACITY
就会送ctl
中解析出runState
的值。
workers
表示的是所有work的数量,映射到thread概念,就是 所有线程池中正在running的任务 (==running的线程数量) + 等待队列中的排队任务