【问题标题】:Java ScheduledThreadPoolExecutor determining how many threads are neededJava ScheduledThreadPoolExecutor 确定需要多少线程
【发布时间】:2015-06-23 04:49:02
【问题描述】:

所有可用的 ScheduledThreadPoolExecutor 构造函数都需要一个 corePoolsize 参数。但我不确定我实际需要多少?

我计划在一个类中使用它,其中一个实例将只使用 1 个计划任务。所以将池大小设置为除 1 之外的任何其他值是没有意义的?或者我应该创建一个静态 ScheduledThreadPoolExecutor 实例以在我自己的类的所有实例之间共享?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    如果您只计划为每个类实例安排一项任务,则不需要在池中使用超过 1 个线程。即使您使用 scheduleAtFixedRate,如果您只安排一项任务,即使它运行的时间长于其周期,它也永远不会同时运行。因此,如果你只调度一个任务,你只需要一个线程。

    如果在您的程序中有意义,那么创建执行程序的共享实例可能是一个好主意。当不必为每个实例创建执行器和线程时,您将获得更好的性能。但是,您必须注意将corePoolSize 至少设置为预期并发任务的最大数量。否则任务可能会延迟。

    【讨论】:

      【解决方案2】:

      最好使用程序运行的机器上可用的内核数作为此参数的值。

      例子:

      int cores = Runtime.getRuntime().availableProcessors();
      

      【讨论】:

      • 想解释一下这个指南吗?我认为这不是一个好的指导方针,尤其是对于 OP 的案例。
      • 根据我的理解 OP 在创建 ScheduledThreadPoolExecutor 时寻找池大小。在任何给定点,机器/CPU 只能处理 N 个线程,其中 N 是可用的内核数。例如,如果机器是四核,则意味着只能并行运行 4 个线程,因此创建更大尺寸的池没有意义。核数 + 2(有助于上下文切换)的池可能足以获得良好的性能。
      • 在许多情况下,创建比 CPU 数量更多的线程确实更有意义。最常见的情况是您想要并行化 IO。你可以有很多线程在单个内核上等待 IO……如果你运行 100% 的 CPU 密集型任务,我倾向于同意你的想法,但这是一个相当大的假设。
      • 如果他们在等待有什么用?不是浪费资源吗?以及维护上下文切换的开销?我同意拥有更多(可能是双核),但当您拥有四核时,不会像 20 那样。stackoverflow.com/questions/12951112/…
      • @Nambari,线程的最初目的是不是使并行编程成为可能:在多处理器计算机从实验室中逃脱之前很久,线程就已被广泛使用。线程的最初目的是促进事件驱动程序,尤其是;时间触发的实时嵌入式软件。多线程程序不会有一个轮询 N 个不同事件源的大型事件循环,而是有 N 个不同的线程,每个线程都等待一种事件——这是一种更简洁的设计。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多