private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
在ThreadPoolExecutor中,用于标识线程池状态和线程池中线程数量都是用ctl这个字段去标识的
线程池状态:
//COUNT_BITS =29
private static final int COUNT_BITS = Integer.SIZE - 3;
//线程池状态
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;
线程池线程容量
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
得到线程池状态
private static int runStateOf(int c) { return c & ~CAPACITY; }
计算线程数量
private static int workerCountOf(int c) { return c & CAPACITY; }
//增加worker的数量
private boolean compareAndIncrementWorkerCount(int expect) {
//典型的原子操作,第一个参数为ctl原来的值,第二个参数为期望的值,如果内存中原来的值的值不是当前值,则返回false
return ctl.compareAndSet(expect, expect + 1);
}