L'implementazione Oracle [1] del flusso parallelo utilizza il thread corrente e in aggiunta a quello, se necessario, anche i thread che compongono il pool predefinito di fork fork ForkJoinPool.common()
, che ha una dimensione predefinita uguale a uno in meno del numero dei core della tua CPU.
Quella dimensione predefinita del pool comune può essere modificato con questa proprietà:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=8
In alternativa, è possibile utilizzare la propria piscina:
ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
list.parallelStream().forEach(/* Do Something */);
).get();
Per quanto riguarda l'ordine, i lavori saranno eseguiti come appena un thread è disponibile, in nessun ordine specifico.
[1] Come correttamente sottolineato da @Holger questo è un dettaglio specifico dell'implementazione (con solo one vague reference nella parte inferiore di un documento), entrambi gli approcci funzioneranno su JVM di Oracle ma non è sicuramente garantito il funzionamento su JVM da altri i fornitori, la proprietà non potrebbe esistere in un'implementazione non Oracle e gli Stream non potrebbero nemmeno utilizzare uno ForkJoinPool
internamente rendendo l'alternativa basata sul comportamento di ForkJoinTask.fork
completamente inutile (see here per i dettagli su questo).
fonte
2015-06-12 12:09:35
Hai letto cosa dice la documentazione? – Kayaman
http://stackoverflow.com/questions/21163108/custom-thread-pool-in-java-8-parallel-stream/21172732#21172732 – assylias
@assylias Davvero una buona risposta. –