corePoolSize 0 的 ThreadPoolExecutor 在任务队列已满之前不应执行任务

2024-01-09

我正在经历Java 并发实践并被困在8.3.1 线程的创建和销毁话题。以下脚注警告不要保留corePoolSize为零。

开发人员有时会试图将核心大小设置为零,以便工作线程 最终会被拆除,因此不会阻止 JVM 退出,但这可能会导致一些问题 不使用 SynchronousQueue 作为工作队列的线程池中看似奇怪的行为 (就像 newCachedThreadPool 所做的那样)。如果池已经达到核心大小,ThreadPoolExecutor 会创建 仅当工作队列已满时才创建新线程。所以任务提交到带有工作队列的线程池 具有任何容量且核心大小为零的任务在队列填满之前不会执行,通常是 不是想要的。

因此,为了验证这一点,我编写了这个程序,该程序无法按上述方式工作。

    final int corePoolSize = 0;
    ThreadPoolExecutor tp = new ThreadPoolExecutor(corePoolSize, 1, 5, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>());

    // If the pool is already at the core size
    if (tp.getPoolSize() == corePoolSize) {
        ExecutorService ex = tp;

        // So tasks submitted to a thread pool with a work queue that has any capacity
        // and a core size of zero will not execute until the queue fills up.
        // So, this should not execute until queue fills up.
        ex.execute(() -> System.out.println("Hello"));
    }

Output: Hello

那么,程序的行为是否表明ThreadPoolExecutor如果提交任务,则创建至少一个线程,无论corePoolSize=0。如果是的话,那么教科书上的警告是什么?

EDIT:测试了代码jdk1.5.0_22根据 @S.K. 的建议进行以下更改:

ThreadPoolExecutor tp = new ThreadPoolExecutor(corePoolSize, 1, 5, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(1));//Queue size is set to 1.

但通过此更改,程序将终止而不打印任何输出。

那么我是否误解了书中的这些陈述?

编辑(@sjlee):在注释中添加代码很困难,所以我将其添加为此处的编辑...您可以尝试此修改并针对最新的 JDK 和 JDK 1.5 运行它吗?

final int corePoolSize = 0;
ThreadPoolExecutor tp = new ThreadPoolExecutor(corePoolSize, 1, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>());

// If the pool is already at the core size
if (tp.getPoolSize() == corePoolSize) {
    ExecutorService ex = tp;

    // So tasks submitted to a thread pool with a work queue that has any capacity
    // and a core size of zero will not execute until the queue fills up.
    // So, this should not execute until queue fills up.
    ex.execute(() -> System.out.println("Hello"));
}
tp.shutdown();
if (tp.awaitTermination(1, TimeUnit.SECONDS)) {
    System.out.println("thread pool shut down. exiting.");
} else {
    System.out.println("shutdown timed out. exiting.");
}

@sjlee 已在评论中发布了结果。


这种奇怪的行为ThreadPoolExecutor在 Java 5 中,当核心池大小为零时,显然被认为是一个错误,并在 Java 6 中悄然修复。

事实上,由于 Java 6 和 7 之间的一些代码返工,该问题在 Java 7 中再次出现。然后将其报告为错误,确认为错误并修复。

无论哪种方式,您都不应该使用受此错误影响的 Java 版本。 Java 5 已于 2015 年终止生命,Java 6 及更高版本的最新可用版本不受影响。 “Java 并发实践”的那一部分不再合适了。

参考:

  • http://cs.oswego.edu/pipermail/concurrency-interest/2006-December/003453.html http://cs.oswego.edu/pipermail/concurrency-interest/2006-December/003453.html(阅读整个线程)
  • http://gee.cs.oswego.edu/dl/concurrency-interest/index.html http://gee.cs.oswego.edu/dl/concurrency-interest/index.html(参见版本ThreadPoolExecutor在 JSR166y 包中。)
  • https://bugs.openjdk.java.net/browse/JDK-7091003 https://bugs.openjdk.java.net/browse/JDK-7091003)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

corePoolSize 0 的 ThreadPoolExecutor 在任务队列已满之前不应执行任务 的相关文章

  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • 到底什么是哈希冲突

    HashMap 中的哈希冲突或哈希冲突并不是一个新主题 我遇到过几个博客和讨论板 以模糊且详细的方式解释如何产生哈希冲突或如何避免它 我最近在一次采访中遇到了这个问题 我有很多事情要解释 但我认为很难准确地给出正确的解释 抱歉 如果我的问题
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • 将 XML 从网站解析到 Android 设备

    我正在启动一个 Android 应用程序 它将解析来自网络的 XML 我创建了一些 Android 应用程序 但它们从未涉及解析 XML 我想知道是否有人对最佳方法有任何建议 这是一个例子 try URL url new URL your
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • 在 Streamreduce 方法中,求和时恒等式必须始终为 0,乘​​法时恒等式必须始终为 1?

    我继续java 8学习 我发现了一个有趣的行为 让我们看一下代码示例 identity value and accumulator and combiner Integer summaryAge Person getPersons stre
  • 文档过滤器在 Java 中不起作用?

    在超过 10 个字符的文本字段中 它必须显示错误 为此 我使用了文档过滤器 JTextField field JTextField txtFld AbstractDocument document AbstractDocument fiel
  • 如何从 jenkins 的现有项目生成 .hpi 插件

    我正在尝试使用 jenkins 的性能插件 但最新版本存在一些问题 如链接中所述 https issues jenkins ci org browse JENKINS 27100 https issues jenkins ci org br
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 在java中打印阿拉伯字符串

    我试图在 java 中显示阿拉伯语文本 但它显示垃圾字符 示例 或有时在我打印时仅显示问号 我如何才能打印阿拉伯语 我听说它与unicode和UTF 8有关 这是我第一次使用语言 所以不知道 我正在使用 Eclipse Indigo IDE
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • CakePHP 2:覆盖 AuthComponent 的“密码”方法

    我的目标是为每个用户提供独特的盐 而不仅仅是使用Configure read Security salt 对于每个用户 我知道 CakePHP 2 x 不再自动对密码进行哈希处理 这允许我对密码执行模型验证 这非常好 但是 我没有看到可以重
  • 为什么 Flask-Migrate 让我进行两步迁移?

    我正在开发一个使用 Flask SQLAlchemy Alembic 及其 Flask 包装器 Flask SQLAlchemy 和 Flask Migrate 的项目 我有四个迁移 1c5f54d4aa34 gt 4250dfa822a4
  • PHP 的引用赋值未按预期工作

    为什么会出现以下情况 class AClass public function construct this gt prop Hello public function get return this gt prop protected p
  • 将日期转换为 UTC 格式

    我想将本地日期转换为 UTC 格式 美国格式 NSString getUTCFormateDate NSDate localDate NSDateFormatter dateFormatter NSDateFormatter alloc i
  • 无法导出函数表达式:“TypeError:xxx 不是函数”

    我试图遵循模块的基本指南 我创建了 test module js var textFunction function console log text exports textFunction 然后我尝试在我的 app js 中使用它 va
  • 如何使用 PHP 使用 foreach 循环 json 对象?

    我如何使用每个来访问和打印参与者姓名 Json 对象是 particpants name 当使用标记化文件上传时 它会被填充 我知道标记化文件确实创建了一个成功的 JSON 对象 正是在 foreach 循环内部给我带来了麻烦 警告 输入非
  • Firebug - 断点没有命中

    我在外部 JS 文件中设置断点 但无法让 Firebug 以一致的方式命中断点 它有时有效 但大多数时候无效 我可以让它工作的唯一方法是打开 中断所有错误 我已经使用了调试器 声明也没有任何运气 如果行号不是绿色 Firebug 似乎无法调
  • 为什么 apache Spark 不能与 java 10 一起使用?我们得到非法反射然后 java.lang.IllegalArgumentException

    是否有任何技术原因导致 Spark 2 3 无法与 java 1 10 一起使用 截至 2018 年 7 月 这是我使用运行 SparkPi 示例时的输出spark submit bin spark submit examples src
  • 如何将外部 jQuery 插件添加到 Odoo 上的列表视图?

    我正在使用 Odoo 10e 我想将 jquery 插件集成到我的模块中 我想集成 jQuery 插件jquery 可调整大小的列 https github com dobtco jquery resizable columns 它很简单
  • 关于“动态”模型验证的建议

    我有一个名为Calendar 将应用于它的验证因用户所做的选择而异 我知道我可以使用自定义验证 条件验证来执行此操作 但对我来说看起来不太干净 我想知道是否可以将其存储在数据库列上并将其传递给 通用 验证器方法 你怎么认为 进一步解释 用户
  • 将新数据推送到 firebase 数据库时设置自定义键

    好吧 我是 Firebase 的新手 我希望在将新数据推送到数据库时拥有自己的密钥 Problem FireBase push setValue mapped values 这给出了如下结构 我如何在那里创建自己的自定义密钥 比如用户名什么
  • 从 WinForms 迁移到 WPF

    那么我们正在考虑从 WinForms 迁移到 WPF WPF 有哪些陷阱 我们得到了组件one的flexgrid 是否有任何wpf网格具有相同的功能 它的一件好事是您可以为单元格实现自己的绘制方法 它可以合并单元格打印并保存为多种文件格式
  • 在 ServiceStack Web 服务中设置公共属性

    我正在尝试使用 Sqlite 为 ServiceStack 服务编写单元测试 由于 Sqlite 不支持存储过程 因此我创建了 ServiceCommand 类型的公共属性 它将命令文本和命令类型作为输入 默认情况下 它配置为运行存储过程
  • 无法解析方法“findViewById(int)”

    我遇到了麻烦findViewByid但我找不到问题出在哪里 这是我的FirstFragment班级代码 import android app Fragment import android os Bundle import android
  • 为什么使用 unix-compress 和 go compress/lzw 会产生不同的文件,而其他解码器无法读取?

    我在终端中压缩了一个文件compress file txt并得到 如预期 file txt Z 当我将该文件传递给ioutil ReadFile in Go buf0 err ioutil ReadFile file txt Z 我收到错误
  • Qt 应用程序框架中的分段错误

    由于 QColor colorMap 9 这会产生分段错误 如果我删除 colorMap 分割错误就会消失 如果我把它放回去 它回来了 如果我清理所有然后构建所有 它就会消失 如果我增加它的数组大小它就会回来 另一方面 如果我减少它 它就不
  • 在代理键上使用反向索引的好习惯? (甲骨文)

    假设我有一个带有自动递增代理键的表 这是使用反向索引的好例子吗 我的说法是否正确 插入 插入索引 会更快 因为新值将随机插入 而不是总是插入最右边的叶子 不断强制重新平衡 索引查找会稍微慢一些 因为数据库必须花费 一点 时间来反转索引 因为
  • 来自服务器的 HTML 响应

    我有一个应用程序将一些数据提交到本地服务器 结果服务器将发回 JSON 说 状态 成功 当我在 2 3 SDK 模拟器中运行该应用程序 但安装在 Galaxy Tab 2 2 SDK 中时 它可以正常工作 相同的响应采用 html 的形式
  • Spark中的FPGrowth算法

    我正在尝试在 Spark 中运行 FPGrowth 算法的示例 但是遇到错误 这是我的代码 import org apache spark rdd RDD import org apache spark mllib fpm FPGrowth
  • corePoolSize 0 的 ThreadPoolExecutor 在任务队列已满之前不应执行任务

    我正在经历Java 并发实践并被困在8 3 1 线程的创建和销毁话题 以下脚注警告不要保留corePoolSize为零 开发人员有时会试图将核心大小设置为零 以便工作线程 最终会被拆除 因此不会阻止 JVM 退出 但这可能会导致一些问题 不