Javaストリームは、ハードウェアの並列処理量に基づいています。しかし、もし私がいつも最大限の並列処理をしたいのであれば?Java 8ストリームでの並列処理の最大化
次のコードを検討してください。 10個のタスクのそれぞれを100ミリ秒間同時に実行したい。
long runUntil = System.currentTimeMillis() + 100;
IntStream.range(0, 10).parallel().forEach(i ->
{
int cnt = 0;
while(System.currentTimeMillis() < runUntil)
cnt++;
System.out.println(i + ": " + cnt);
});
しかし、私が得る結果は次のとおりです。
2: 56443
1: 67506
4: 74693
6: 70549
0: 0
3: 0
5: 0
7: 0
8: 0
9: 0
だから、唯一の4つのタスクを並列に実行され、最初の4の1が終了したときに第五タスクのみを開始します。私はすべてのタスクをほぼ同じ時間に開始し、お互いを待たないようにします。
Custom thread pool in Java 8 parallel streamの複製であることに同意しません。なぜなら、この質問は他のタスクをブロックする処理が遅いということですが、私の場合は、(できる限り)並列性を最大化するStream APIを使用します。そうパラレルタスクが同時に実行される
Runtime.getRuntime().availableProcessors(); // 4 in your case
:
期待される結果は何ですか? –
あなたは4つのコアを持っているようです。 – 4castle
'を同時に100ミリ秒実行する:a)すべてのタスクを同時に開始するか、b)100ms実行するまで終了しないかを指定しますか? –