ForkJoinPool 使用的錯誤寫法

2021-08-20 17:13:15 字數 931 閱讀 1520

compute分出多個task後:以task1,task2為例

錯誤做法:

1)依次執行task1.fork(),task2.fork()

2)依次執行task1.join(),task2.join()

正確做法:

1)直接呼叫invokeall(task1,task2)

fork():

把task置入當前forkjoinworkerthread的queue中,等待被消費

join():

當前forkjoinworkerthread執行等待該task執行結束

錯誤做法過程:

將task1與task2置入queue中,當前forkjoinworkerthread停下來等待task1,task2的執行結束。

分析:當前的forkjoinworkerthread可以說join之後什麼事情都沒有做,只是等待ing。而task1和task2會在新的執行緒中執行。

會浪費當前forkjoinworkerthread的寶貴執行緒資源。而且最糟糕的是,會建立乙個新的forkjoinworkerthread去執行新的task,可想而知,如果任務量特別多,那會同時開啟特別多的執行緒。

開啟visualvm,可以看到這裡已經建立太多的守護執行緒,而且每個執行緒都處於等待狀態。

正確做法過程:

將task1置入queue中,當前forkjoinworkerthread執行task2,最後停下來等待task1的執行結束。

分析:當前forkjoinworkerthread一直在執行,把需要執行task都直接執行。

充分利用的執行緒資源,當前forkjoinworkerthread也會執行乙個task的任務,不會讓當前forkjoinworkerthread傻等結果。

ForkJoinPool的工作原理和使用

場景 當任務很多,成千上萬個,或者單個任務很大,執行起來很耗時間,這時,就可以把任務進行拆分,拆分成多個小任務去執行,然後小任務執行完畢後再把每個小任務執行的結果合併起來,這樣就可以節省時間。forkjoinpool實現了executorservice介面,所以它也是一種執行緒池,做的工作就是,把乙...

ForkJoinPool 原始碼分析

乙個forkjoinpool 對應多個forkjoinworkerthread 乙個forkjoinworkerthread 對應多個forkjointask 以乙個簡單的求和task為例 public class forkjointest catch interruptedexception ex...

說一下 jdk7 的 ForkJoinPool

by yinmingjun 網上找了一下 forkjoinpool 的資料,發現資料不多,看來大多的兄弟還留在 executors 的坑里沒出來。簡單的說,forkjoinpool 是更好的執行緒池的技術,主要是面向目前的多執行緒高併發的場景提供的底層工具,理念和效能上比原來的執行緒池模式高不少 沒...