1 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
1 private static final int COUNT_BITS = Integer.SIZE - 3; 2 private static final int CAPACITY = (1 << COUNT_BITS) - 1;
CAPACITY 常量的值为 (1 << COUNT_BITS) - 1 ,其中 << 为左移运算符,这么说可能不太直观,我以二进制直接写出这个数将有助于理解:
1 0000 0000 0000 0001 1 << 29 - 1 0001 1111 1111 1111
因此在接下来的代码中, COUNT_BITS 就用来表示分隔runState 和workerCount 的位数;
1 private static final int RUNNING = -1 << COUNT_BITS; 2 private static final int SHUTDOWN = 0 << COUNT_BITS; 3 private static final int STOP = 1 << COUNT_BITS; 4 private static final int TIDYING = 2 << COUNT_BITS; 5 private static final int TERMINATED = 3 << COUNT_BITS;
1 //拆包函数 2 private static int runStateOf(int c) { return c & ~CAPACITY; } 3 private static int workerCountOf(int c) { return c & CAPACITY; } 4 //打包函数 5 private static int ctlOf(int rs, int wc) { return rs | wc; }
说到这里可能仍有些让人疑惑,我将再以二进制的形式表示出所有涉及到的变量/常量:
//下文中a和b分别代表runState和workerCount的有效信息
//CAPACITY 0001 1111 1111 1111 //ctl aaab bbbb bbbb bbbb //runState aaa0 0000 0000 0000 //workerCount 000b bbbb bbbb bbbb
1 private static boolean runStateLessThan(int c, int s) { 2 return c < s; 3 } 4 5 private static boolean runStateAtLeast(int c, int s) { 6 return c >= s; 7 } 8 9 private static boolean isRunning(int c) { 10 return c < SHUTDOWN; 11 }
1 private boolean compareAndIncrementWorkerCount(int expect) { 2 return ctl.compareAndSet(expect, expect + 1); 3 } 4 5 private boolean compareAndDecrementWorkerCount(int expect) { 6 return ctl.compareAndSet(expect, expect - 1); 7 } 8 9 private void decrementWorkerCount() { 10 do {} while (! compareAndDecrementWorkerCount(ctl.get())); 11 }
1 ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c)))
A1:有安全检查,在ThreadPoolExecutor类的addWorker方法中有这样一行代码:
1 if (wc >= CAPACITY ||
2 wc >= (core ? corePoolSize : maximumPoolSize)) 3 return false;
Q2:为什么为 workerCount 的修改提供了方法,却没有为 runState 的修改提供?
原文链接:https://www.cnblogs.com/moonfair/p/13477974.html