Java基礎(chǔ)——一文讀懂Fork/Join框架
分而治之
fork/Join框架的思想是將一個規(guī)模為n的大任務(wù),fork成幾個規(guī)模較小的K個子任務(wù),最后合并所有子任務(wù)的結(jié)果,返回最終結(jié)果。

工作竊取
如圖一個規(guī)模為T的任務(wù)劃分成12個子任務(wù),分別有4個線程在執(zhí)行。如果當(dāng)前線程沒有可執(zhí)行任務(wù)時,會從其他線程的任務(wù)隊列中竊取任務(wù)來執(zhí)行。工作竊取算法保證了cpu不會處于空閑狀態(tài)。

ForkJoin用法
1.帶返回值RecursiveTask

打印統(tǒng)計結(jié)果

2.無返回值RecursiveAction

等待所有任務(wù)執(zhí)行結(jié)束

Java8 Stream并行流的Fork/Join框架使用
如下所示代碼,利用Java8的并行流,對1到5的數(shù)進行相乘

1.parallel()方法設(shè)置標(biāo)志位
設(shè)置了sourceStage.parallel 值為true

2.reduce()方法根據(jù)標(biāo)志位來判斷是否并行
evaluate方法,會調(diào)用isParallel(),對上面的sourceStage.parallel進行判斷

3.terminalOp的接口以及實現(xiàn)類
接口TerminalOp

實現(xiàn)類ReduceOps新建了ReduceTask對象

對ReduceTask進行代碼追蹤,最后會追蹤到ForkJoinTask類中,invoke方法是ForkJoinTask()的invoke()方法
結(jié)論
由此我們可以看出,Java8的Stream并行流底層代碼,確實采用了Fork/Join框架來實現(xiàn)