在阅读Java线程池ThreadPoolExecutor源码的时候,发现它很巧妙地把线程池状态runState和线程数workCount两个变量存放在了一个int型变量里面。

我们先看一个数值,如下是一个32位int的二进制:

0 0000 0000 0000 0000 0000 0000 0001

1)高位第一位表示符号,0是正数,1是负数

2)高位第二位和第三位表示runState的绝对值(线程池运行状态),runState可取值(-1,0,1,2,3)分别表示(running,shutdown,stop,tidying,terminated)

3)剩下的用来表示线程数workCount,这里表示仅有1个线程,总共可以存储2^29-1个线程,大概5亿个。

如何存储在一个变量?

这样的表示法,把状态和workCount存储在了一个int变量里,那么这个变量是怎么计算出来的呢?

首先,我们先获得runState的值,比如:

int runState = -1

再把runState向左移位29位

-1 << 29

这样就得到了

0 0000 0000 0000 0000 0000 0000 0000

假设现在有3个线程,那么workCount = 3,我们把上面得到得值再加上workCount,即按位或( | )运算,如下

1010 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------
0 0000 0000 0000 0000 0000 0000 0011

上面,我们把runState和workCount存储在一个变量里,接下来我们看看如何把他们拆解开。

如何取到runState?

上面我们得到了一个变量

1010 0000 0000 0000 0000 0000 0000 0011

我们知道32位的二进制中,高位前三位其实就是runState,所以我们去除后面29位的值即可。我们只需要做一个按位与( & )运算

1010 0000 0000 0000 0000 0000 0000 0011
1110 0000 0000 0000 0000 0000 0000 0000
---------------------------------------
0 0000 0000 0000 0000 0000 0000 0000

只需要把结果向右移位29位即可得到runState的值(ThreadPoolExecutor的runState是已经移位以后的值,与本文不同)

如何取到workCount?

后29位就是workCount的值,所以我们去除前3位的值即可。同样我们做一个按位与( & )运算

1010 0000 0000 0000 0000 0000 0000 0011
0001 1111 1111 1111 1111 1111 1111 1111
---------------------------------------
0 0000 0000 0000 0000 0000 0000 0011

最新文章

  1. [转]Java并发编程:Lock
  2. SQL Server中常用的SQL语句(转):
  3. 幻灯片插件FlexSlider -- Amaze UI幻灯片参数
  4. hiho#1033 : 交错和
  5. objectARX 获取ucs的X方向
  6. Probably at least one of the constraints in the following list is one you don&#39;t want.
  7. 2017年AR大会上海站干货分享
  8. BZOJ:4825: [Hnoi2017]单旋
  9. STL中set的使用方法
  10. 修改openstack用户配额
  11. [原]openstack-kilo--issue(二十二) 虚拟机的vnc console图像调用错误
  12. i.MX6 u-boot 怎么确定板级头文件
  13. 下面的程序段创建了BufferedReader类的对象in,以便读取本机c盘my文件夹下的文件1.txt。File构造函数中正确的路径和文件名的表示是( )。
  14. angular2 bootstrap modal
  15. iCOM组件(iComponent,应用或学习组件)
  16. php表达式
  17. Visual Tree
  18. cxf之org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 37; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 &#39;jaxws:server&#39; 的声明。
  19. Environment.GetEnvironmentVariable
  20. unity3d项目版本管理设置

热门文章

  1. Python 基础学习的几个小例子
  2. HTM概述
  3. 22 Flutter仿京东商城项目 inappbrowser 加载商品详情、保持页面状态、以及实现属性筛选业务逻辑
  4. Qt编写安防视频监控系统6-面板开关
  5. 关于Android Studio中Gradle的一些乱七八糟的问题
  6. Python基础-day04
  7. iOS——sqlite3的使用(iOS嵌入式关系数据库)
  8. 《剑指offer》数组专题 (牛客10.22)
  9. mdk3洪水攻击教程
  10. [转帖]龙芯:Docker 配置与实践清单