newFixedThreadPool.setCorePoolSize() 不使用线程,创建新的线程,这可能会产生开销

2024-02-17

newFixedThreadPool.setCorePoolSize() 不使用线程,而是创建新线程。

解释: 我创建了一个大小为 2 的 newFixedThreadPool,如果该池的两个线程都很忙,我会使用 setCorePoolSize() 向该池添加另外两个线程。在此过程中,它似乎没有重用线程,或者可能会终止一些线程并创建新线程,我将用代码解释这一点。

代码:(另请参阅输出以供理解)

public class IncreasePoolSize
{
    static ExecutorService service = null;
    public static void main(String[] args) throws JMSException, InterruptedException
    {
        int NoOfth = 2;
        int noOfTimesToInc = 0;
        System.out.println("Start");
        service = Executors.newFixedThreadPool(NoOfth);
        for (;;)
        {
            if ( ((ThreadPoolExecutor)service).getActiveCount() >= NoOfth )
            {
                if (noOfTimesToInc < 1)
                {
                    System.out.println("Increased Threads-" + (noOfTimesToInc + 1) + " time(s)");
                    NoOfth += 2;
                    System.out.println("NoOfTh-" + NoOfth);
                    ((ThreadPoolExecutor)service).setCorePoolSize(NoOfth);
                    System.out.println("Total no of theads after increasing-" + ((ThreadPoolExecutor)service).getCorePoolSize());
                    noOfTimesToInc++;
                }

            }
            else if ( ((ThreadPoolExecutor)service).getActiveCount() <= NoOfth)
            {
                service.execute(new ConcreteThread());
            }
        }
    }

}

class ConcreteThread implements Runnable
{
    public void run() 
    {
        try
        {
             System.out.println("Thread No-" + Thread.currentThread().getId());
             Thread.sleep(5000);
             System.out.println("Thread No-" + Thread.currentThread().getId() + " finished");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

在输出中可以看到,一旦线程 11 和 12 开始工作,我将数量增加 2,因此线程 13 和 14 开始工作,但之后,我总是创建新线程而不是使用线程 11 和 12 并重用线程 13和 14。

输出:(已在调试模式下运行)

Start
Thread No-11
Thread No-12
Increased Threads-1 time(s)
NoOfTh-4
Total no of theads after increasing-4
Thread No-13
Thread No-14
Thread No-11 finished
Thread No-12 finished
Thread No-13 finished
Thread No-14 finished
Thread No-15
Thread No-16
Thread No-13
Thread No-14
Thread No-15 finished
Thread No-16 finished
Thread No-13 finished
Thread No-14 finished
Thread No-17
Thread No-18
Thread No-13
Thread No-14
Thread No-17 finished
Thread No-18 finished
Thread No-13 finished
Thread No-14 finished
Thread No-19
Thread No-20
Thread No-13
Thread No-14
Thread No-19 finished
Thread No-20 finished
Thread No-13 finished
Thread No-14 finished
Thread No-21
Thread No-22
Thread No-13
Thread No-14
Thread No-21 finished
Thread No-22 finished
Thread No-13 finished
Thread No-14 finished
Thread No-23
Thread No-24
Thread No-13
Thread No-14


您的代码存在的一个问题是您设置了核心池大小,但没有设置最大池大小。 AnewFixedThreadPool使用相同数量的核心和最大池大小,您在某种程度上违反了该合同。

如果您添加:

service.setMaximumPoolSize(NoOfth);

设置核心池大小后,将按照您的预期重用相同的 4 个线程。

Note: 这实际上是报告的错误 https://bugs.java.com/bugdatabase/view_bug?bug_id=7153400

ThreadPoolExecutor的构造函数和setMaximumPoolSize如果出现以下情况,则抛出 IllegalArgumentExceptioncorePoolSize > maximumPoolSize, but setCorePoolSize才不是。

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

newFixedThreadPool.setCorePoolSize() 不使用线程,创建新的线程,这可能会产生开销 的相关文章

  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • 无法访问“不安全”java方法的java表达式语言

    我正在开发一个项目 让用户向服务器提交小 脚本 然后我将执行这些脚本 有很多脚本语言可以嵌入到Java程序中 例如mvel ognl uel clojure rhino javascript等 但是 据我所知 它们都允许脚本编写者调用Jav
  • JUnit5 平台启动器 API - 如果没有至少一个测试引擎,则无法创建启动器

    我正在尝试升级我们的自动化测试套件的测试能力以接受 JUnit5 测试并遵循JUnit 平台启动器 API 说明 https junit org junit5 docs current user guide launcher api我收到错
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • Erlang 如何睡觉(晚上?)

    我想在 Erlang 服务器上每隔几个小时运行一次小型清理过程 我知道计时器模块 我在教程中看到一个示例 使用链式计时器 睡眠命令来等待几天后发生的事件 我觉得这很奇怪 我知道 Erlang 进程与其他语言中的进程相比是独一无二的 但是进程
  • 如何在 HandlerInterceptorAdapter 中添加 HttpServletRequest 标头?

    我正在尝试将授权标头添加到我的请求中 作为我们切换环境时的临时解决方法 我试图在扩展 HandlerInterceptorAdapter 的拦截器中处理它 我使用 MutableHttpServletRequest 类制作here http
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 确定序列化对象的类型

    我需要通过套接字发送消息 从用户到引擎的请求 以及从引擎到用户的响应 所以流程本质上是 serialized request Server lt network gt Client serialized response request r
  • java setFullScreenWindow 在 Mac 中隐藏登录对话框

    我使用的是全屏窗口 类似于屏幕保护程序 使用这里的方法 GraphicsEnvironment getLocalGraphicsEnvironment getDefaultScreenDevice setFullScreenWindow t
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 生成 equals 和 hashcode 时忽略属性

    假设我有一个类 Customer public class Customer private String firstName private String lastName private String doNotAddMeToEqual
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 删除 JFX 中选项卡后面的灰色背景

    So is there any way to remove the gray area behind the tab s 我尝试过用 CSS 来做到这一点 但没有找到方法 要设置 tabpane 标题的背景颜色 请在 CSS 文件中写入 t
  • 使用 PC/SC 读卡器验证 Ultralight EV1

    我在尝试使用 Java 中的 PC SC 读卡器 特别是 ACR1222L 验证 Ultralight EV1 卡时遇到问题 我能够使用 ISO 14443 3 标签的相应 APDU 在不受保护的标签上进行写入和读取 但是 我找不到运行 P
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • Java/MongoDB 按日期查询

    我将一个值作为 java util Date 存储在我的集合中 但是当我查询以获取两个特定日期之间的值时 我最终得到的值超出了范围 这是我的代码 插入 BasicDBObject object new BasicDBObject objec

随机推荐

  • 如何在curl命令中传递标头作为参数? [复制]

    这个问题在这里已经有答案了 我正在尝试执行一个使用预定义变量作为标头的curl 命令 header H Content Type application json H userGUID 7feb6e62 35da 4def 88e9 376
  • 如何使用 Selenium 在 Instagram 弹出框架中向下滚动

    我有一个使用 selenium 的 python 脚本来访问给定的 Instagram 个人资料并迭代用户的关注者 在 Instagram 网站上 当点击查看关注者列表时 会打开一个弹出窗口 其中列出了帐户 这里是该网站的屏幕截图 http
  • 我可以将用户限制在 Google 地图上的特定范围和缩放级别吗?

    我正在网页上实现 Google 地图 出于本项目的目的 我想限制用户可以拖动地图的距离 以便他们只能查看位于两个坐标内的某个区域 一个指定西北 另一个指定东南 如果你明白我的意思 使用 Google Maps API 实现此目的的最佳方法是
  • 批处理文件:无法回显循环内的变量

    我已经跌入谷底 我似乎无法完成这项工作 setlocal EnableDelayedExpansion for g in 1 2 3 do set a c g 32 echo c pause 但它说ECHO已打开 我知道这意味着它没有什么可
  • 如何在 iOS 中以编程方式设置宽高比约束? [复制]

    这个问题在这里已经有答案了 我已经为我的视图控制器使用了自动布局 我已经在约束中设置了 V 和 H 位置 但我想知道当按钮变为 5s 6 和 6 Plus 时如何增加按钮大小 这是我为登录按钮添加约束的方式 NSArray btncon V
  • NSFetchedResultsController 和实体继承

    我的模型事件中有一个父实体 还有两个子实体 生日 周年纪念日 我正在使用核心数据中内置的实体继承功能 以便生日和周年纪念日的父对象是事件 所以我使用以下命令进行获取 NSFetchRequest fetchRequest NSFetchRe
  • R tmap 打印意大利

    我想画一张地图 我需要打印的国家 地区是意大利 我使用以下代码 library sf library raster library dplyr library spData library spDataLarge library tmap
  • Bootstrap 4 面包屑中的文本右对齐

    我想右对齐 Bootstrap 4 的面包屑类中的链接 我用 BS3 中的 pull right 类很容易地做到了这一点 但是 BS4 的 float right 并不能完成这项工作 例如
  • Jquery Ajax 请求调用两次并且第一个请求未在标头中发送令牌

    我正在使用 ajax 调用基于 WCF REST 的服务 ajax 方法在页面加载之前调用 我希望在ajax请求的标头中发送一个 Token 在 fiddler 中 我看到的是这样的 1 请求头中没有令牌的服务请求 AJAX 调用失败 2
  • Highstock inputDateParser 触发三次

    我不确定是什么原因导致它在选择日期后触发三次日期日历 http bootstrap datepicker readthedocs org en release index html 这是设置的选项rangeSelector rangeSel
  • 使用 topojson 映射美国邮政编码时出错

    加载美国邮政编码 topojson 文件后 我在 d3 js 中收到错误 groupdata该行未定义 function bind group groupData var i n group length m groupData lengt
  • boost::bimap 用于枚举

    我正在尝试为 C 中的枚举创建一个简单的双向查找工具 我的单向查找工作正常 enum MyEnum One Two Three const boost unordered map
  • 如何在 Android 中打开拨号器并一步返回您的应用

    在我的应用程序中 我有一个带有电话号码的按钮 当用户单击它时 拨号器应用程序将打开 并显示电话字段中的号码 但是 如果我想从拨号器返回到我的应用程序 我应该按 返回 按钮 3 次 第一次按会关闭拨号器键盘 第二次按会将我带到拨号器历史记录菜
  • NHibernate 投影和“Having”子句

    我正在使用 NHibernate 通过条件 API 查询我的数据库 我的标准如下 ICriteria c Session CreateCriteria typeof Transaction ProjectionList projection
  • 清除 Marshmallow 以上操作系统版本上的缓存

    我想制作一个 Android 应用程序来清理其他应用程序的缓存 我已经弄清楚如何为棉花糖以下的 Android 版本执行此操作 This https github com Frozen Developers android cache cl
  • CSS - 将页面居中 - 然后使页面高度为 100%

    我正在尝试将页面居中 然后将其制作100 在高度上 我有一个名为 content 的 div 作为 HTML 页面中所有元素的父元素 接下来我需要做什么 我想远离任何 CSS hacks 目前该功能在 IE7 中有效 但在 Firefox
  • C++ 基数转换

    你好 我正在尝试将一些代码从 Windows 移植到 Linux 我有这个 itoa word aux 2 但 GCC 不承认 itoa 我如何以 C 方式进行到基数 2 的转换 谢谢 Here http en wikipedia org
  • 为什么 CreateProcess 在 Windows Server 2003 64 位中失败?

    我们有一个 32 位应用程序 它在其进程中启动其他 32 位应用程序 该应用程序在其他 64 位平台上运行良好 但在 Windows Server 2003 64 位平台上 我们在尝试启动应用程序时遇到错误 error 193 not a
  • Delphi中如何通过所有子目录搜索文件

    我已经在 Delphi 中实现了这段代码 它将搜索文件或给定的名称 但省略搜索所有子目录 如何才能做到这一点 Code if FindFirst filePath faAnyFile searchResult 0 then try repe
  • newFixedThreadPool.setCorePoolSize() 不使用线程,创建新的线程,这可能会产生开销

    newFixedThreadPool setCorePoolSize 不使用线程 而是创建新线程 解释 我创建了一个大小为 2 的 newFixedThreadPool 如果该池的两个线程都很忙 我会使用 setCorePoolSize 向