【问题标题】:Executors.newFixedThreadPool() - how expensive is this operationExecutors.newFixedThreadPool() - 这个操作有多昂贵
【发布时间】:2016-03-07 06:21:04
【问题描述】:

我有一个要求,我需要为当前的现场表演处理一些任务。 这是一个计划任务,每分钟运行一次。

在任何给定的分钟内,都可以有任意数量的现场表演(虽然数量不可能那么大,最多大约 10 个)。 所有直播节目需要完成 20 多项功能。或者说那里有 20 个工人阶级,所有人都在那里工作

假设第一个功能,有 5 个节目,几分钟后节目减少到 2 个,几分钟后又增加到 7 个

目前我正在做这样的事情,

int totalShowsCount = getCurrentShowsCount();
ExecutorService executor = Executors.newFixedThreadPool(showIds.size());

上述语句每分钟执行一次。

问题陈述

1.) 上述操作要花多少钱..??。在每一分钟创建固定线程池。

2.) 我可以做些什么来优化我的解决方案,我应该使用固定的线程池,比如 (10),并且可能在任何给定的分钟内使用 3 或 5 或 6 个或任意数量的线程。

我可以在工作人员级别创建一个固定线程池,并对其进行维护吗? 利用它。

仅供参考,使用 Java8,如果有更好的方法可用。

【问题讨论】:

  • 你为什么每分钟都重新创建一个新的ExecutorService?难道不能实例化一次(在启动时)并每次都重用它吗?
  • @Spotted 我有 20 名工人,每个工人都有自己的工作,我想为所有工人创建单独的池 - 我应该..??如果我为所有工作人员创建公共池,可能是我工作人员消耗更多线程的情况,所有工作人员将每分钟启动一次,可能存在我的一个工作人员没有任何线程的情况。
  • 为什么不使用单个可调整大小的池 (Executors.newCachedThreadPool)?

标签: java performance executorservice


【解决方案1】:

以上操作要花多少钱..??。在每一分钟创建固定线程池。

创建线程池是一项相对昂贵的操作,可能需要几毫秒。您不希望每秒执行多次。

对于一台计算机来说,一秒是永恒的,如果你有一台 36 核的机器,它可以在这段时间内执行多达 1000 亿条指令。一分钟是一个非常非常长的时间,如果你每分钟只做一次,你甚至可以每分钟重新启动一次 JVM,仍然可以获得合理的吞吐量。

我可以做些什么来优化我的解决方案,我应该使用一个固定的线程池,比如 (10),或者在任何给定的分钟使用 3 或 5 或 6 个或任意数量的线程。

可能,这取决于您在做什么。如果没有大多数分析,您可以肯定地说。注意:如果你使用的是parallelStream(),如果不是你应该看看是否可以,你可以使用内置的ForkJoinPool.commonPool(),而不需要创建另一个池。但同样,这取决于你在做什么。

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 2011-09-11
    • 1970-01-01
    • 2011-12-06
    • 2020-06-24
    • 2016-01-31
    • 2010-12-15
    • 2013-06-16
    • 2011-03-21
    相关资源
    最近更新 更多