13

スレッドプールを使用してタスクを実行しています。ほとんどの場合、CPUの数より1大きいサイズのI/Oのビットに基づくCPUです。

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)

すべてのタスクをこのエグゼキュータに送信し、他にほとんど何もしない単純なプログラムの場合、OSがCPUをタイムスライスする必要があるため、スレッドプールをこれ以上大きくすると、処理が遅くなると想定します。走る。

それは正しいですか。そうであれば、これは実際の問題であるか、ほとんど理論上の問題です。つまり、スレッドプールのサイズを1000に増やした場合、大きな違いに気付くでしょう。

4

2 に答える 2

11

CPUにバインドされたタスクがある場合、スレッドの数を増やすと、オーバーヘッドが増加し、パフォーマンスが低下します。注:待機中のタスクよりも多くのスレッドを使用することは、リソースの浪費にすぎませんが、タスクの速度をそれほど低下させない場合があります。

スレッドが多すぎると驚くほど多くのオーバーヘッドが発生する可能性があるため、1つだけを追加するのではなく、CPUの数の倍数(たとえば1または2)を使用します。

于 2012-10-18T09:22:19.860 に答える
9

参考までに、この説明を確認してください。

http://codeidol.com/java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/

要するに、あなたが持っているもの(CPU数+1)は平均して最適です。

于 2012-10-18T09:34:25.020 に答える