ctl:
ThreadPoolExecutor用一个AtomicInteger来存储线程池工作状态和工作线程数量。ctl二进制的高三位用来保存线程池工作状态,其余用来保存工作线程数量。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 初始值:状态RUNNINT,工作线程数量:0
private static final int COUNT_BITS = Integer.SIZE - 3; // Integer.SIZE=29
private static final int CAPACITY = (1 << COUNT_BITS) - 1; // 2^29-1
// runState 用32位整形的高三位表示
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; } // 根据ctl计算runState
private static int workerCountOf(int c) { return c & CAPACITY; } // 根据ctl计算workerCount
private static int ctlOf(int rs, int wc) { return rs | wc; } // 根据runState和workerCount计算clt值
状态转换:
1.RUNNING->SHUTDOWN:调用了shutdown()方法
2.(RUNNING or SHUTDOWN)->STOP:调用了shutdownNow()方法
3.SHUTDOWN->TIDYING:当队列中任务都被取出执行完成,并且所有工作线程都结束了任务,再没有未被执行的任务
4.STOP->TIDYING:线程池中没有正在运行的线程。(任务队列中任务都被取消了)
5.TIDYING->TERMINATED:钩子方法terminated()执行完毕后