摘自ThreadPoolExecutor中ctl变量的理解_threadpoolexecutor ctl-CSDN博客
摘自

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。

作者:张三  创建时间:2025-02-28 19:17
最后编辑:张三  更新时间:2025-02-28 19:19