java
标准化、规范化
java代码风格
【目录】java
编程-java8
编程-java9
编程-java-见过的异常
gradle
编程-java21
编程-java23
编程-java17
编程-java11
【目录】java-web-其它框架
java-vertx
quarkus
javalin
solon
Helidon
【目录】spring家族
spring
springcloud + nacos
consul
springboot启动流程
springboot使用及原理
springcloud
优化springboot
【java高级】
java-多线程-问题记录
java高级-ArrayList
java高级-HashMap
jdk源码解析-TreeMap红黑树
java对象占用多少字节
juc(并发)
ThreadPoolExecutor中ctl变量的理解
ThreadPoolExecutor分析
JVM(java虚拟机)
jvm学习路线
jvm
Java启动参数
debug
java-debug-arthas
java-debug-jdb
高并发/高性能/高可用
设计代码或编写代码时应该考虑的
如何发现系统中的瓶颈?
场景分析
mysql
mysql explain
mysql主从
mysql常见异常
方法论
工作中遇到的问题记录
代码优化
学习的思路
产品
本文档使用 MrDoc 发布
-
+
首页
ThreadPoolExecutor中ctl变量的理解
> 摘自[ThreadPoolExecutor中ctl变量的理解_threadpoolexecutor ctl-CSDN博客](https://blog.csdn.net/miaoyibo12/article/details/85258486) > 摘自[ThreadPoolExecutor 中的 ctl 变量 - 简书](https://www.jianshu.com/p/66fd50c37326) 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年2月28日 19:19
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
eblog
Markdown文件
分享
链接
类型
密码
更新密码