我理解为什么线程池大小与CPU核心数量有关,但为什么ForkJoinThread
的设计者默认使用# of cpu cores - 1
个线程?为什么-1
?
如果我正在构建我自己的ForkJoinPool
(不使用公共实例),并且池上的main
线程被阻塞等待它返回一些结果,我有什么理由想要分配少于Runtime.getRuntime().availableProcessors()
个线程?
更新:请解释为什么要进行投票。否则,我无法改善这个问题。
答案 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
。