java ThreadPoolExecutor 中的workerCountOf()方法

2023-12-02

我试图理解 ThreadPoolExecutor 类。我发现该类中声明了一些最终变量,但无法理解它们的用途。

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;         //29
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;    //536870911     00011111111111111111111111111111

// RUN_STATE is stored in the high-order bits
private static final int RUNNING    = -1 << COUNT_BITS;         //-536870912    11100000000000000000000000000000
private static final int SHUTDOWN   =  0 << COUNT_BITS;         //0             00000000000000000000000000000000
private static final int STOP       =  1 << COUNT_BITS;         //536870912     00100000000000000000000000000000
private static final int TIDYING    =  2 << COUNT_BITS;         //1073741824    01000000000000000000000000000000
private static final int TERMINATED =  3 << COUNT_BITS;         //1610612736    01100000000000000000000000000000

以上是最终变量及其二进制和十进制值。

然后我发现两种使用这些变量的方法:

private static int runStateOf(int c)     { return c & ~CAPACITY; }  // RUN_STATE & ~CAPACITY = RUN_STATE
private static int workerCountOf(int c)  { return c & CAPACITY; }   // RUN_STATE & CAPACITY = 0
private static int ctlOf(int rs, int wc) { return rs | wc; }

方法前面的注释是我观察到的输出。

Now in ThreadPoolExecutor#execute(可运行) method,

它正在使用如下语句进行以下计算If fewer than corePoolSize threads are running

int c = ctl.get();
if (workerCountOf(c) < corePoolSize)

我试图理解,在这种情况下,workerCountOf(c) 的值可以大于 corePoolSize。 如您所见,ctl 的初始值为 RUNNING。

另外,还有一些方法可以原子地增加和减少 ctl 值,

private boolean compareAndIncrementWorkerCount(int expect) {
    return ctl.compareAndSet(expect, expect + 1);
}

private boolean compareAndDecrementWorkerCount(int expect) {
    return ctl.compareAndSet(expect, expect - 1);
}

现在假设有 5 个线程正在运行,所以ctl = RUNNING + 5,

即使这样workerCountOf(ctl.get()) = 0 ,

As ((RUNNING+5) & CAPACITY) = 0.

谁能解释一下创建这些最终变量的原因及其用途?

workerCountOf() 方法实际上如何返回正在运行的线程数?

我肯定错过了什么。

Thanks


如您所见,Java 使用int ctl字段用于存储池的当前状态和线程数。状态存储在高三位中,所有其他位用于存储线程数。按位掩码CAPACITY用于将它们彼此分开:

  • CAPACITY = 00011111111111111111111111111111
  • ~CAPACITY = 11100000000000000000000000000000

Thus,

  • ctl & CAPACITY保留低 29 位并将高 3 位清零;结果是当前线程数
  • ctl & ~CAPACITY保留高三位并将所有其他位清零;结果是池运行状态

正如您正确注意到的那样,具有五个线程的运行池ctl = (RUNNING + 5),具有二进制表示形式111000...000101。因此,应用CAPACITYmask 将最高三位清零并给出值000000...000101,是 5,而不是 0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java ThreadPoolExecutor 中的workerCountOf()方法 的相关文章

  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • 浏览器之间的颜色(颜色)差异?

    我刚刚注意到我正在处理的一个网站在 Chrome 中看起来与其他浏览器 saf ff 不同 Chrome 中的所有内容都更加饱和 甚至是背景色 rgb 我不知道是什么导致了这种情况发生 不能与 img 颜色配置文件有任何关系 否则 rgb
  • 在 Swift 中创建一个接受本机 Swift 协议的弱容器

    这是 Swift 中的标准样板弱容器 struct Weak
  • 为每条记录保存带有新行的 R JSON 对象

    我正在尝试保存一个 JSON 对象 其中每一行都是一条记录 如何保存 JSON 对象以使行数等于记录数 在下面的示例中为 5 library jsonlite df mtcars 1 5 x lt jsonlite toJSON df re
  • 什么是投影和选择?

    投影和选择有什么区别 是吗 投影 gt 用于选择表的列 和 选择 gt 选择表的行 那么投影和选择分别是垂直和水平切片吗 Exactly 投影意味着选择哪些列 或表达式 查询应返回 选择 means 哪些行将被退回 如果查询是 select
  • 如何让物体沿圆弧路径运动?

    我正在制作一个游戏 其中应该有一个机器人向另一个机器人扔球形物体 投出的球应以对称的弧线飞行 很确定这个数学词是抛物线 两个机器人都在 x 轴上 我怎样才能在我的游戏中实现这样的事情 我尝试了不同的方法 但没有一个有效 我的游戏中当前移动物
  • 透明背景模糊的 JFrame

    我想对 JFrame 的背景进行模糊处理 该背景是透明的以显示其下方发生的情况 但我不知道如何模糊背景并避免闪烁 我想要实现的是拥有一个稍微模糊的透明背景 但仍然显示其下方窗口的 实时视图 而不是拥有不改变的模糊静态图片 请记住 窗口可能会
  • Laravel 中的二维码

    我想制作qr码 在那里我可以制作它 但是当我想将qr码的格式更改为png文件时遇到麻烦 但它唯一的显示符号 这是我的观点 我使用这个二维码 simplesoftwareio simple qrcode 1 这是我的参考 https www
  • 对自己调用复制构造函数

    我很好奇我几乎错误地编写的这段代码中发生了什么 include
  • 将图像从网页的 html 部分拖放到画布上后如何访问图像数据?

    这是一个后续问题如何将文本和图像拖放到画布上 火狐41 0 1 我根本不知道如何访问我放到画布上的图像的图像数据 我尝试过类似的事情data event dataTransfer getData image 但这一切都不起作用 functi
  • 如何制作编号段落(HTML5/CSS3)

    我正在编写 HTML5 中的 QuickBASIC 4 5 指南 并且我已经得到了很多工作 但我想知道如何对我的代码行进行编号 或停止文本换行 目前 我的代码如下所示 1 PRINT Hello World 2 INPUT Who are
  • RSelenium 无法打开浏览器

    我想使用 Selenium 从 R 进行网页抓取 我的Windows版本 Windows 11 21H2 我有最新的 Java 更新 1 8 0 351 评论它 因为我已经看到它可能是这种情况下的修复 但是 在定义驱动程序对象时 出现以下错
  • 如何退出 git log 或 git diff [重复]

    这个问题在这里已经有答案了 我正在尝试在以下的帮助下学习 Git沉浸式 Git 每当我使用时 有一件事让我感到沮丧git log or git diff 当我遇到这种情况时 我不知道下一步该怎么做 END word 我无法输入任何命令 最终
  • 将巨大图像(5mb)加载到 svg 背景中会导致像素化和性能问题

    我有一些问题像素化和表现SVG 背景图像与 D3 js 一起 您已经可以在这里看到一个正在运行的示例 http arda maps org ages first 请不要分享 直到它仍然是 Alpha 版本 谢谢 Example So let
  • 如何创建带有日期的图表工具提示(日期时间格式)

    我无法获得正确格式的提示 foreach RootObject o in myRootObjects seriesTemperatur Points AddXY DateTime Parse o datum o temp seriesPre
  • Perl 5.8.8 不支持 XML::LibXML 吗?

    我回答了一个question不久前我最初建议使用 XML DOM 后mirod建议我使用 XML LibXML 代替 我实现了它 说实话 它在我的系统上运行得很好 我发现新模块的运行时间大幅下降 而无需进行任何额外的优化 现在棘手的部分是
  • 在 Coq 中实现向量加法

    在某些依赖类型语言 例如 Idris 中实现向量加法相当简单 根据维基百科上的例子 import Data Vect default total pairAdd Num a gt Vect n a gt Vect n a gt Vect n
  • IE 必须关闭才能使事件与 jQuery 一起工作

    快速概述 函数 getbillno tbl 默认返回显示 1 ELSE echo 1 问题 在 IE 中 无论我显示什么 即使页面是空白 它也总是显示 1 我没有点击刷新 而是尝试关闭 IE 9 它确实显示了正确的值 我再次更改了代码中的值
  • 开源报告服务? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有免费的开源的报告服务我们可以将其部署在网络服务器中 并且不需要任何许可 实际上 我对整个框架 工具包 报告设计 查看和托管感兴趣 它应该能够从
  • 构建 OSX 应用程序包

    假设我在没有使用 Xcode 的情况下制作了一个 osX 应用程序 使用 GCC 编译后 我得到一个链接到其他几个库的可执行文件 其中一些库可能会再次动态链接到其他非标准系统库 是否有任何工具可以通过首先创建所需的目录结构 然后递归地复制
  • java ThreadPoolExecutor 中的workerCountOf()方法

    我试图理解 ThreadPoolExecutor 类 我发现该类中声明了一些最终变量 但无法理解它们的用途 private final AtomicInteger ctl new AtomicInteger ctlOf RUNNING 0