【问题标题】:Executor ScheduledThreadPool What are effects of "more" thread pools?Executor ScheduledThreadPool “更多”线程池的作用是什么?
【发布时间】:2018-06-16 17:45:35
【问题描述】:

我有一个 一个类 的 3 个实例,它实现了runnable 接口。我正在实例化我的Executor 类,如下所示;

 executor = Executors.newScheduledThreadPool(2);<--- talking about this part
    executor.scheduleAtFixedRate(unassignedRunnable, 0, refreshTime, TimeUnit.SECONDS);
    executor.scheduleAtFixedRate(assignedToMeRunnable, 2, refreshTime, TimeUnit.SECONDS);
    executor.scheduleAtFixedRate(createTicketsFromFile, 3, refreshTime * 2, TimeUnit.SECONDS);

我的问题是,如果我将线程池计数从 2 更改为 13 会有什么不同吗?我尝试过,几乎一无所获。谁能解释线程池计数的实际用途?也许我的任务很轻?

【问题讨论】:

  • 想必你的任务确实是轻量级的。该参数生成新线程 - 如果您有一个每秒运行一次的任务需要 900 毫秒才能运行,那么该线程将有 100 毫秒的空闲时间。如果您有另一个每秒运行的任务需要 900 毫秒才能运行,那么您的线程池将无法应对。这里没有经验法则 - 如果您的计划任务在您要求的容差范围内运行,那么您不需要更多线程。
  • @BoristheSpider 我明白了。谢谢。所以有点“试试看”。
  • 是的。基准,基准,基准。然后再进行一些基准测试...
  • @BoristheSpider 好的基准爱好者.. 非常感谢。请将您的回复移至答案部分,以便我选择“答案”。

标签: java multithreading threadpool executorservice threadpoolexecutor


【解决方案1】:

您需要了解,无论您要创建多少线程,最终,线程都将在 可用内核数 上执行。现在,根据documentation,它是“保留在池中的线​​程数,即使它们处于空闲状态。”

你能告诉我线程池计数的真正用途是什么

executor = Executors.newScheduledThreadPool(2);

以上代码行将在线程池中创建2 线程,但这并不意味着所有人都会做一些工作。但是,在同一时间,同一个线程可以用于执行来自线程池的一些其他任务,这些任务已提交。

因此,最好在选择要创建的线程总数之前了解您的要求。 (我通常更喜欢数字,取决于可用核心数)

【讨论】:

  • 只有当任务是 CPU 而不是 IO 绑定时,可用内核数才相关。如果计划任务将审计日志写入文件或其他任何内容,那么拥有更多 CPU 线程是有意义的。
  • @BoristheSpider 当然可以。如果您想提出任何声明,请继续
【解决方案2】:

即 corePoolSize 是池中的编号线程。可用线程选择符合条件的任务并在同一个线程中运行。如果没有可用的线程虽然任务有资格运行,但由于所有线程都忙,因此不会执行。在您的情况下可能是您的任务非常短暂。要演示创建大小为 1 的核心池并提交长时间运行的任务,然后提交轻量任务检查行为,然后将核心池大小增加到 2 并查看行为。

【讨论】:

    【解决方案3】:

    这取决于您运行应用程序的机器的 CPU 内核数。如果您有更多的 CPU 内核,如果您的应用程序不是 IO Bound 应用程序,则可以并行运行多个线程,并且可以提高整个系统的性能。

    CPU 绑定的应用程序将受益于更多数量的内核和线程。

    如果您有 4 核 CPU,您可以将值配置为 4。如果您的机器是单 CPU 核,将池大小更改为 4 将没有任何好处。

    相关的 SE 问题:

    Java: How to scale threads according to cpu cores?

    Is multithreading faster than single thread?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 2023-03-30
      • 2015-09-11
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多