4

我有一个关于使用 fork join 线程池的简单问题。这是我正在使用的一个简短示例:

  executor = "fork-join-executor"
  # Configuration for the fork join pool
  fork-join-executor {
    # Min number of threads to cap factor-based parallelism number to
    parallelism-min = 24
    # Parallelism (threads) ... ceil(available processors * factor)
    parallelism-factor = 4.0
    # Max number of threads to cap factor-based parallelism number to
    parallelism-max = 48
  }

我不确定的是,在这种情况下会创建多少个线程?我在 2 核机器上运行,所以每个内核有 24 个线程,最多 48 个线程?

将并行度因子设置为 4.0,可以并行运行的线程数将是 8。那么设置最小值和最大值(我的情况是 24 和 48)需要什么?

4

1 回答 1

6

让我们首先解释并行性是如何ForkJoinPool工作的。线程数由单个(构造函数)参数parallelism(默认情况下的内核数)控制。ForkJoinPool试图保持最多parallelism 运行的线程。但如果其中一些线程被阻塞,它可以决定生成更多线程。例如,如果您有太多等待加入的分叉任务,除非您添加新线程,否则您的计算将被阻塞;等待线程处于活动状态但未运行(因为它们在等待)。更多解释在这里

您问题中的调度程序配置控制parallelism参数将设置为什么值。它设置为可用的处理器* parallelism-factor,但至少parallelism-min和最多parallelism-max在此处此处查看更多信息。

在这种情况下将创建多少个线程?

并行度应该是2 cores * 4 -> 8 threads. 所以运行线程数应该是8个,但是总创建的线程数可能会更高。

设置最小值和最大值的需要是什么,我的情况是 24 和 48

我认为这只是在您部署在具有不同内核数量的机器上的情况下。

于 2016-05-10T09:35:24.893 回答