2015-11-13 2 views
5

Ho determinato che l'utilizzo di un flusso parallelo è effettivamente più veloce di un flusso seriale per il mio set di dati. Detto questo, mi chiedo se ForkJoinPool sia usato come è stato discusso in questa domanda: Custom thread pool in Java 8 parallel stream.ForkJoinPool.commonPool() equivale a nessun pool?

Dato,

void foo() 
{ 
    barCollection.parallelStream() … do something with the stream 
} 

vengono a cui piscina saranno utilizzati 1 & 2 sotto equivalente rispetto?

1)

ForkJoinPool.commonPool().submit(()->foo()).get(); 

2)

foo(); 

Se la risposta è sì, allora perché il metodo di ForkJoinPol.commonPool() esiste?

+0

[Correlato] (http://stackoverflow.com/q/23564104/1743880) – Tunaki

+2

È possibile inviare un'attività al pool comune che non utilizza uno stream ... – assylias

+0

@assylias, ovviamente, grazie ! –

risposta

11

L'esecuzione dello stream parallelo utilizzerà il pool comune, ma la libreria di flussi è solo un possibile client di quel pool.

Per quanto riguarda il motivo per cui esiste il metodo commonPool(), l'ipotesi che il pool comune esista a causa di flussi non è corretta. Il pool comune esiste (ed è facile da raggiungere) per evitare la "tragedia dei beni comuni" altrimenti inevitabile, in cui ogni iniziatore di un'operazione parallela crea i propri pool, causando troppi thread di pool su una singola JVM, minando l'efficienza. Con una piscina comune, il percorso di minor resistenza - basta usare la piscina comune - è generalmente anche la scelta migliore.

I flussi paralleli sono uno di questi iniziatori delle operazioni parallele e utilizzano il pool comune, ma non sono speciali.

+1

grazie per la risposta e correggendo la mia ipotesi, questa è l'informazione esatta che sto cercando. –