前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >源码解析:ThreadPoolExecutor(4)

源码解析:ThreadPoolExecutor(4)

作者头像
爪哇缪斯
发布2023-05-09 21:47:09
810
发布2023-05-09 21:47:09
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

3.2> 什么是ctl

  • 当我们看execute方法的时候,映入眼帘的就是ctl
  • 那它到底是什么东西呢?下面截图源码和注释就是ctl所包含的方法
  • 针对ctl的值,其实是两部分组成的:【高3位】表示:线程池状态 + 【低29位】表示:线程池中线程数量,如下图所示:

【解释】

上图中的runState:-1、0、1、2、3,其实是针对于红色3位来计算的,其实应该是32位来计算,这么写是为了方便大家直观感受到这5种状态值的大小。

其实如果按照32位来计算的哈,从小到大状态的排序依然是:RUNNING<SHUTDOWN<STOP<TIDYING<TERMINATED,后面对于多种状态的判断也是通过大小来判断的。

  • CAPACITY=(1<<COUNT_BITS)-1的计算方式如下所示:
  • 针对ctl.get()获得的int值,其实是有3个重要方法:
  • int runStateOf(int c) 获取运行状态 RUNNING/SHUTDOWN/STOP/TIDYING/TERMINATED
  • int workerCountOf(int c) 取出低位29位的值,表示获得当前活动的线程数。
  • int ctlOf(int rs, int wc) 计算ctl的值,ctl=[3位]线程池状态 + [29位]线程池中线程数量。

3.3> 线程池中的线程数量小于核心线程数代码逻辑

  • 源码部分如下所示:

【解释】

其中的workerCountOf(c)用来获得当前线程池中的线程数,如果小于核心线程数,则直接调用addWorker方法来向线程池中创建线程。如果添加成功,则直接return返回。如果添加失败了,则重新通过ctl.get()获取最新的ctl值。用于下面逻辑的判断。


后面的内容,参见:源码解析:ThreadPoolExecutor(5)

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-20,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3.2> 什么是ctl
  • 3.3> 线程池中的线程数量小于核心线程数代码逻辑
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com