Java线程池---ThreadPoolExecutor中的ctl变量

ThreadPoolExecutor中有一个控制状态的属性叫ctl,它是一个AtomicInteger类型的变量,它包含两个概念:

  1. workerCount:表明当前有效的线程数
  2. runState:表明当前线程池的状态,是否处于Running,Shutdown,Stop,Tidying,Terminate五种状态。

为了把这两种状态放到一个int值中保存,代码中限定了workerCount的值是2^29-1,因为还有五种状态需要表示,需要3位才能表示五种状态,所以会有29位来表示workerCount,而剩下的3位来表示当前线程池的状态。


Java线程池---ThreadPoolExecutor中的ctl变量_第1张图片
Paste_Image.png

从上图可以看出COUNT_BITS这个属性就是Integer.SIZE-3,也就是29。说明线程数所占位数为29位,而CAPACITY得到的就是1向左无符号移29位-1,得到的就是低28位全是1的536870911。而看到下方的五个状态,分别是-1,0,1,2,3向左无符号移29位。

位数计算

从上图可以看到workerCountOf这个函数传入ctl之后,是通过ctl&CAPACITY操作来获取当前运行线程总数的。也就是RunningState|WorkCount&CAPACITY,算出来的就是低28位的值。因为CAPACITY得到的就是高3位(29-31位)位0,低28位(0-28位)都是1,所以得到的就是ctl中低28位的值。
runStateOf这个方法的话,算的就是RunningState|WorkCount&CAPACITY,高3位的值,因为CAPACITY是CAPACITY的取反,所以得到的就是高3位(29-31位)为1,低28位(0-28位)为0,所以通过&运算后,所得到的值就是高3为的值。
从而理解了ctl中是高3位作为状态值,低28位作为线程总数值来进行存储的原因。

你可能感兴趣的:(Java线程池---ThreadPoolExecutor中的ctl变量)