为什么常见的ForkJoinPool不会尝试使用所有内核?

时间:2016-05-28 03:11:48

标签: java threadpool fork-join

我理解为什么线程池大小与CPU核心数量有关,但为什么ForkJoinThread的设计者默认使用# of cpu cores - 1个线程?为什么-1

如果我正在构建我自己的ForkJoinPool(不使用公共实例),并且池上的main线程被阻塞等待它返回一些结果,我有什么理由想要分配少于Runtime.getRuntime().availableProcessors()个线程?

更新:请解释为什么要进行投票。否则,我无法改善这个问题。

2 个答案:

答案 0 :(得分:1)

Oracle JDK implementation中有评论。它声明

 * When external threads submit to the common pool, they can
 * perform subtask processing (see externalHelpComplete and
 * related methods) upon joins.  This caller-helps policy makes it
 * sensible to set common pool parallelism level to one (or more)
 * less than the total number of available cores, or even zero for
 * pure caller-runs.

换句话说,当外部(不是FJP线程的一部分)(可以)帮助执行任务时,额外的线程并不总是有益的。

答案 1 :(得分:0)

这很有道理。主线程始终需要一个线程,一次运行的最大线程数是内核总数。因此,默认并行度为# of cpu cores - 1