スレッドプールを使用してタスクを実行しています。タスクは、ほとんどがCPUの数より1大きいサイズのI/Oのビットに基づくCPUです。
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)
すべてのタスクをこのエグゼキュータに送信し、他にほとんど何もしない単純なプログラムの場合、OSがスレッドプール内の各スレッドにチャンスを与える機会をより頻繁にCPUにタイムスライスする必要があるため、スレッドプールをこれ以上大きくすると速度が低下すると思います実行します。
それは正しいですか?もしそうなら、これは本当の問題またはほとんど理論的な問題です。つまり、スレッドプールのサイズを1000に増やした場合、大きな違いに気付くでしょう。
CPUにバインドされたタスクがある場合、スレッドの数を増やすと、オーバーヘッドが増加し、パフォーマンスが低下します。注:待機中のタスクよりも多くのスレッドがあることは、リソースの浪費にすぎませんが、タスクの速度がそれほど遅くなることはありません。
スレッドが多すぎると驚くほどのオーバーヘッドが発生する可能性があるため、1つだけを追加するのではなく、CPUの数の倍数(たとえば、1または2)を使用します。
参考までに、この説明を確認してください。
http://codeidol.com/Java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/
要するに、あなたが持っているもの(No. CPU + 1)は平均して最適です。