ThreadPoolExecutor中ctl变量的理解

ThreadPoolExecutor中有个int型变量(其实是AtomicInteger类型)ctl
它的作用是存储线程池的状态和工作线程数量,原理是如何实现的呢:
第一个问题是一个变量如何存储两个数据:
首先,我们知道,int类型是4个字节,也就是32位,例如一个int值在计算机中的表示:
00000000 01000100 11111111 00000000
因为ThreadPoolExecutor中定义的状态有5种(RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED)
用1位表示,则只有0、1两种情况,只能表示两种状态;
用2为表示,有00、01、10、11四种情况,只能表示四种状态;
用3为表示,有222=8种情况;
所以状态值至少要用3位,那么就可以用int的高3位来表示(最左边3个),剩下29个就可以表示线程数量(所以
线程数量最大值就是29位上全是1)。

每当线程池中的线程数量或状态发生变化时,具体操作的便是ctl变量,如以下方法:
private boolean compareAndIncrementWorkerCount(int expect) {
return ctl.compareAndSet(expect, expect + 1);
}

那么又是读取线程状态和数量的值呢:
读取状态利用以下方法:
private static int runStateOf(int c) { return c & ~CAPACITY; }
CAPACITY是个常量00011111 11111111 11111111 11111111,通过 &(按位与)运算,
可以保留高3位,把低29位全部变为0;

读取数量利用以下方法:
private static int workerCountOf(int c) { return c & CAPACITY; }
可以把高3位变为0,低29位保留。

其中传入的参数c,就是ctl。

参考:https://www.jianshu.com/p/d262de881b9b

猜你喜欢

转载自blog.csdn.net/miaoyibo12/article/details/85258486
今日推荐