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。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值