JDK8 では、parallelStream を使用するといくつのスレッドが生成されますか? たとえば、次のコードでは:
list.parallelStream().forEach(/** Do Something */);
このリストに 100000 個の項目がある場合、いくつのスレッドが生成されますか?
また、各スレッドには同じ数の作業項目が割り当てられるのでしょうか、それともランダムに割り当てられるのでしょうか?
ベストアンサー1
Oracleの並列ストリームの実装[1]では、現在のスレッドが使用され、さらに必要に応じて、デフォルトのフォーク結合プールを構成するスレッドも使用されます。ForkJoinPool.commonPool()
このプールのデフォルトのサイズは、CPUのコア数より1つ少ないサイズです。
共通プールのデフォルト サイズは、次のプロパティで変更できます。
-Djava.util.concurrent.ForkJoinPool.common.parallelism=8
あるいは、独自のプールを使用することもできます。
ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
list.parallelStream().forEach(/* Do Something */);
).get();
順序に関しては、スレッドが利用可能になるとすぐにジョブが実行されますが、順序は特に決まっていません。
@Holgerが正しく指摘したように、これは実装固有の詳細です(曖昧な言及ドキュメントの下部にあるように、どちらのアプローチも Oracle の JVM では動作しますが、他のベンダーの JVM では動作が保証されていません。プロパティは Oracle 以外の実装には存在しない可能性があり、Streams は完全に役に立たないForkJoinPool
動作に基づいて代替手段を内部的にレンダリングすることさえできませんForkJoinTask.fork
(こちらをご覧ください詳細についてはこちらをご覧ください。