写点什么

JAVA 线程池源码之深入状态值分析| Java Debug 笔记,java 原理面试题

用户头像
极客good
关注
发布于: 刚刚

//这个值的大小,看自己需求吧,这个写 29 是给线程数留住了最大空间了.(读写锁里面这个是 16, 感兴趣可以去看看 ReentrantReadWriteLock.)

private static final int CAPACITY = (1 << COUNT_BITS) - 1;

//这个值很关键,就是它用来分割一个值的。`CAPA


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


CITY不是随便写的,它的二进制, 都是29位的1, 1111111111111111,如果COUNT_BITS`是 16,代入(1 << COUNT_BITS) - 1)中, 就是低位补 16 个 0,减一个 1,结果就是 16 个 1,如果是 2,就是 2 个 1。

线程状态值

// runState is stored in the high-order bits


private static final int RUNNING = -1 << COUNT_BITS;


private static final int SHUTDOWN = 0 << COUNT_BITS;


private static final int STOP = 1 << COUNT_BITS;


private static final int TIDYING = 2 << COUNT_BITS;


private static final int TERMINATED = 3 << COUNT_BITS;


重点我们看看这个表格,主要前面 3 位。


计算线程池状态

回顾一下前面的内容,我想应该忘得差不多了,能查到的资料,我也从来不记,我的头脑是让我思考用的。


&与运算 两个操作数中位都为 1,结果才为 1,否则结果为 0。


~即 0 变成 1,1 变成 0.(简单来说是加一,然后取反)比如 3 ,加一,是 4,取反为-4.更直观的详细计算方式请看我上一章。 Thanks?(?ω?)?


用 RUNNING 的状态来计算


//线程池状态 private static int runStateOf(int c) {//CAPACITY =536870911,~后是-536870912//CAPACITY 取反进制是 11100000000000000000000000000000//RUNNING 的取进制是 11100000000000000000000000000000//结果 进制是 11100000000000000000000000000000//todo:结果与 RUNNING 相符合,敲重点,所以这里是取的高位 return c & ~CAPACITY;}

运行的线程数量计算

我们假定目前线程运行的数量是1,线程运行状态为RUNNING


private static int workerCountOf(int c) {//CAPACITY 536870911 进制是 00011111111111111111111111111111//-536870911 线程数是 1 进制是 11100000000000000000000000000001//结果 进制是 00000000000000000000000000000001//& 两个操作数中,位都为 1,结果才为 1,否则结果为 0//todo:敲重点,所以这里是取的是低位。return c & CAPACITY;}


因为 CAPACITY 高位为000,所以无论怎么算(&)都是取的低29位


更新线程池运行状态

或运算符用符号“|” ,两个位只要有一个为 1,那么结果就是 1,否则就为 0。


private static int ctlOf(int rs, int wc) {


//比如目前状态为 RUNNING,线程数量为 1。那么值就是


//1110 0000 0000 0000 0000 0000 0000 0001//0000 0000 0000 0000 0000 0000 0000 0000//1110 0000 0000 0000 0000 0000 0000 0001 //结果 return rs | wc; }

总结

下一篇来个,手写一个线程池吧!本人知识有限,如有描述错误之处,愿虎正。你看这个



像不像你欠我的赞。 谢谢大家。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
JAVA线程池源码之深入状态值分析| Java Debug 笔记,java原理面试题