这是线程池的一个典型实现
public class ThreadPoolExecutor extends AbstractExecutorService
继承自AbstractExecutorService
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
这个是原子变量 值为RUNNING状态与0的按位或值
private static final int COUNT_BITS = Integer.SIZE - 3;
这个是计算状态用的位数 为29
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
这个是线程池容量 2的29次方减一
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
正在运行状态 用-1左移29位 负数的左移操作的是补码 也就是负数二进制值除了符号位以外 都取反 然后加一得出补码 然后补码左移29位 最后得出一个很大的负数值
private static final int SHUTDOWN = 0 << COUNT_BITS;
关闭状态 0左移29位
private static final int STOP = 1 << COUNT_BITS;
停止状态 1左移29位
private static final int TIDYING = 2 << COUNT_BITS;
整理状态 2左移29位
private static final int TERMINATED = 3 << COUNT_BITS;
终止状态 3左移29位
// Packing and unpacking ctl
private static int runStateOf(int c) { return c & ~CAPACITY; }
这个是获取状态的方法 返回的是参数按位与CAPACITY取反的结果
private static int workerCountOf(int c) { return c & CAPACITY; }
这个是计算worker数目的方法 用参数按位与CAPACITY
private static int ctlOf(int rs, int wc) { return rs | wc; }
这个是获取上面那个原子变量操作数的方法 返回两个参数按位或的结果
为什么这么麻烦呢?有说法是这些状态位前四位存的是状态 后28位存的是线程数 咱们继续看
private static boolean runStateLessThan(int c, int s) {
return c < s;
}
private static boolean runStateAtLeast(int c, int s) {
return c >= s;
}
private static boolean isRunning(int c) {
return c < SHUTDOWN;
}
这三个方法都是脱离ctl而判断线程池状态的方法
private boolean compareAndIncrementWorkerCount(int expect) {
return ctl.compareAndSet(expect, expect + 1);
}
private boolean compareAndDecrementWorkerCount(int expect) {
return ctl.compareAndSet(expect, expect - 1);
}
这两个是ctl的cas方法 涉及增减worker
private void decrementWorkerCount() {
do {} while (! compareAndDecrementWorkerCount(ctl.get()));
}
这个是调用上面的方法给worker数减一 直到返回true为止