2016-05-28 23 views
-1

私はスレッドプールサイズがCPUコアの数に結びついている理由を理解していますが、ForkJoinThreadの設計者はデフォルトで# of cpu cores - 1スレッドを使用するのはなぜですか?なぜ-1共通のForkJoinPoolがすべてのコアを使用しようとしないのはなぜですか?

私が構築していた場合、私自身ForkJoinPool(共通インスタンスを使用していない)、およびmainスレッドは、それはいくつかの結果を返すのを待って、プールでブロックされている、私はRuntime.getRuntime().availableProcessors()スレッドよりも少ない割り当てしたい何らかの理由があるのでしょうか?

更新日:ダウン投票の理由を説明してください。それ以外の場合、私は質問を改善することはできません。

+0

JVMは通常、ガベージコレクションを行うためにいくつかのコアを予約します。これは実行中のアーキテクチャとどのGC実装が選択されているかによって大きく異なります。 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html –

+0

@AndrewRueckertコメントでダウンボートする代わりに、これを回答として投稿してください。これは合理的な説明です。 – Gili

+0

私はあなたにdownvoteをしませんでしたが、私は私の答えが "Answer"の資格を得るのに充分だとは思わなかった。とにかく、私は間違っていました。 :/ –

答えて

1

Oracle JDK implementationにコメントがあります。これは、タスクの実行を支援する(できる)場合は、外部(FJPのスレッドの一部ではない)、追加のスレッドが常に有益ではない、言い換えれば

* 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. 

を述べています。

+0

良い検索。ありがとうございました! – Gili

関連する問題