正常情況下,當使用Java 8的parallelStream()時,結果是通過默認的公共fork-join池(即ForkJoinPool.commonPool())執行。Java的parallelStream()與自定義池與呼叫者工作竊取?
但是,這顯然是不可取的,但是,如果有一項工作遠離CPU限制,例如,可能會在很多時候等待IO。在這種情況下,人們會想要使用一個單獨的池,根據其他標準來確定大小(例如,多長時間的任務可能實際使用CPU)。
有沒有明顯獲取parallelStream()使用不同的池的方法,但有一種方法,如詳細here。
不幸的是,該方法需要從fork-join池線程調用並行流的終端操作。這樣做的缺點是,如果目標分支連接池完全忙於現有工作,那麼整個執行過程就會等待,而完全沒有任何作用。因此該池可能成爲比單線程執行更糟的瓶頸。相比之下,當以「普通」方式使用parallelStream()時,將使用ForkJoinPool.common.externalHelpComplete()或ForkJoinPool.common.tryExternalUnpush()來讓池外的調用線程幫助處理。
有誰知道的方式來都得到parallelStream()使用非默認的fork-join池和有一個調用線程從的fork-join池的幫助之外在這項工作中的處理(但不是fork-join池的其餘部分)?
我不明白你的_這個缺點是,如果目標叉加入池完全忙於現有的work_。你不會爲這個並行流調用創建一個新的池嗎? –
更糟。當你在任務中調用'get'而不是在公共池中時,它仍然會調用'ForkJoinPool.common.tryExternalUnpush()',但是當然不會在公共池隊列中找到任務。 – Holger
要回答這個問題,不,我不會爲這個調用創建一個新的線程池。相反,我會在許多類似的調用中共享另一個線程池,其中一些可能會重疊,其中一些可能比其他更長/更大的任務等。 –