Die Oracle-Implementierung [1] von Parallel Stream verwendet den aktuellen Thread und bei Bedarf zusätzlich auch die Threads, aus denen der Standard-Fork-Join-Pool besteht ForkJoinPool.commonPool()
, dessen Standardgröße eins weniger als die Anzahl der Kerne Ihrer CPU beträgt .
Diese Standardgröße des gemeinsamen Pools kann mit dieser Eigenschaft geändert werden:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=8
Alternativ können Sie Ihren eigenen Pool verwenden:
ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
list.parallelStream().forEach();
).get();
In Bezug auf die Reihenfolge werden Jobs ausgeführt, sobald ein Thread verfügbar ist, und zwar in keiner bestimmten Reihenfolge.
Wie von @Holger richtig hervorgehoben, handelt es sich um ein implementierungsspezifisches Detail (mit nur einem vagen Verweis am Ende eines Dokuments). Beide Ansätze funktionieren mit der JVM von Oracle, es ist jedoch definitiv nicht garantiert, dass sie mit JVMs anderer Anbieter funktionieren in einer Nicht-Oracle-Implementierung nicht vorhanden und Streams konnten nicht einmal ein ForkJoinPool
internes Rendern der Alternative verwenden, basierend auf dem Verhalten von ForkJoinTask.fork
völlig nutzlos ( siehe hier für Details dazu).