前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java线程池---ThreadPoolExecutor中的ctl变量

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

作者头像
None_Ling
发布2018-10-24 15:03:55
1.7K0
发布2018-10-24 15:03:55
举报
文章被收录于专栏:Android相关Android相关

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

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

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

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位作为线程总数值来进行存储的原因。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档