Normalmente quando si utilizza parallelStream() di Java 8, il risultato è l'esecuzione tramite il pool comune di fork-join predefinito (ad esempio ForkJoinPool.commonPool()).Java parallelStream() con pool personalizzato con il furto del lavoro del chiamante?
Ciò è chiaramente indesiderabile, tuttavia, se si ha un lavoro che è lontano dal limite della CPU, ad es. potrebbe essere in attesa su IO per la maggior parte del tempo. In questi casi, si vorrà utilizzare un pool separato, dimensionato in base ad altri criteri (ad esempio, quanto tempo è probabile che le attività utilizzino effettivamente la CPU).
Non c'è ovvio mezzo di ottenere parallelStream() per utilizzare un pool diverso, ma esiste un modo come dettagliato here.
Sfortunatamente, questo approccio comporta il richiamo dell'operazione terminale sul flusso parallelo da un thread del pool di fork-join. Lo svantaggio di questo è che se il pool di join di fork di destinazione è completamente occupato con il lavoro esistente, l'intera esecuzione lo attende senza fare assolutamente nulla. Pertanto, il pool può diventare un collo di bottiglia peggiore rispetto all'esecuzione a thread singolo. Al contrario, quando si utilizza parallelStream() nella modalità "normale", ForkJoinPool.common.externalHelpComplete() o ForkJoinPool.common.tryExternalUnpush() vengono utilizzati per consentire al thread chiamante dall'esterno del pool di aiutare nell'elaborazione.
Qualcuno sa di un modo per sia ottenere parallelStream() per utilizzare un pool non predefinito fork-join e hanno un thread chiamante da fuori piscina aiuto fork-join nella lavorazione di questo lavoro (ma non il resto del lavoro di fork-join pool)?
Non capisco il tuo _Il lato negativo di questo è che se il pool di join del fork di destinazione è completamente occupato con il lavoro esistente_. Non creeresti un nuovo pool solo per questa invocazione di stream parallelo? –
È ancora peggio. Quando chiami 'get' sulle tue attività che non sono nel pool comune, chiamerà ancora' ForkJoinPool.common.tryExternalUnpush() ', ma, ovviamente, non troverà l'attività nella coda del pool comune. – Holger
Per rispondere alla domanda, no, non vorrei creare un nuovo pool di thread solo per questa chiamata. Piuttosto condividerei questo altro gruppo di thread attraverso molte invocazioni simili, alcune delle quali potrebbero sovrapporsi, alcune delle quali potrebbero avere compiti molto più lunghi/più grandi di altre, ecc. –