怎么通过分析线程池 ctl 变量位运算理解其如何同时管理运行状态与有效线程数

大杰吖_5294

大杰吖_5294

2026-05-01

620人浏览

原创

ctl高3位存线程池状态(5种状态需3位),低29位存工作线程数,因32−3=29,理论最大线程数为2²⁹−1≈5.0亿,兼顾状态表达与数量精度。

怎么通过分析线程池 ctl 变量位运算理解其如何同时管理运行状态与有效线程数

ctl 的位布局怎么拆解:高3位状态 + 低29位线程数

Java 的 ThreadPoolExecutor 用一个 AtomicInteger ctl 同时存两个关键信息:线程池当前运行状态(runState)和当前有效工作线程数(workerCount)。它不是靠对象封装,而是靠位运算硬编码进一个 32 位整数里——高 3 位是状态,低 29 位是数量。

为什么是 3 和 29?因为线程池有 5 种状态(RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED),至少需要 3 个 bit 表示;剩下 29 位留给线程数,理论最大值是 CAPACITY = (1 ,即 536870911,远超实际需求。

常见错误是误以为 ctl 是「状态 + 数量」的简单拼接。其实它是通过移位+按位或组合的:比如 RUNNING 是 -1 (二进制高 3 位全 1),而线程数 3 是 0b11,两者 | 后得到 ctl 值,例如 0b11100000_00000000_00000000_00000011。

runStateOf 和 workerCountOf 怎么从 ctl 中分离出状态和数量

读取时靠两个掩码常量完成无损拆分:

  • runStateOf(c) 实际执行 c & ~CAPACITY:对 ctl 按位与上 ~CAPACITY(即高 3 位为 1、低 29 位为 0 的掩码),只保留高 3 位,其余清零
  • workerCountOf(c) 实际执行 c & CAPACITY:对 ctl 按位与上 CAPACITY(即高 3 位为 0、低 29 位为 1 的掩码),只保留低 29 位

注意:~CAPACITY 不是简单的取反,而是针对 32 位 int 的补码取反。例如 CAPACITY = 0x1FFFFFFF,则 ~CAPACITY = 0xE0000000,高位正好是状态区。

如果你在调试时打印 ctl.get() 得到一个负数(如 -536870912),别慌——那是 RUNNING 状态(-1 )加 0 个线程的结果,属于正常现象。

ctlOf(rs, wc) 组装时为什么用 | 而不用 +

组装新 ctl 值用的是 rs | wc,不是 rs + wc,原因很实在:

  • rs 高 3 位非 0,低 29 位全是 0;wc 高 3 位全是 0,低 29 位可能非 0;二者按位或天然互不干扰
  • 若用 +,当 rs 是负数(如 RUNNING = -536870912)且 wc > 0,会触发符号位参与运算,结果不可控
  • 位或操作是幂等、无进位、可预测的,符合原子更新的语义要求

比如 ctlOf(RUNNING, 3) → 0xE0000000 | 0x00000003 = 0xE0000003,干净利落;换成加法就可能溢出或改变状态位。

状态比较为何能直接用 c 这种整数比较

因为所有状态常量都左移了 29 位,彼此之间天然满足大小关系:

  • RUNNING = -1
  • SHUTDOWN = 0
  • STOP = 1
  • TIDYING = 2
  • TERMINATED = 3

所以 isRunning(c) 直接写成 c ,本质是判断高 3 位是否等于 111(即 -1 的符号扩展形态)。这种设计让状态流转校验极快,也避免了 switch 或枚举比较的开销。

容易被忽略的一点是:状态只能单向推进,但 ctl 本身不阻止你手动构造非法值(比如把 TERMINATED 改回 RUNNING)。线程池靠源码中大量 if (runStateLessThan(c, STOP)) 这类防护逻辑来守住边界,而不是靠 ctl 自身的类型安全。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11537

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8642

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7432

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1224

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

988

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1476

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3029

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20291

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1335

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习