事例項(xiàng)目:https://gitee.com/silentwu/java-concurrency-tutorial
fork-join介紹
Fork/Join框架是Java 7提供的一個(gè)用于并行執(zhí)行任務(wù)的框架,是一個(gè)把大任務(wù)分割成若干個(gè)小任務(wù),最終匯總每個(gè)小任務(wù)結(jié)果后得到大任務(wù)結(jié)果的框架。Fork/Join框架要完成兩件事情:
- 任務(wù)分割:首先Fork/Join框架需要把大的任務(wù)分割成足夠小的子任務(wù),如果子任務(wù)比較大的話還要對(duì)子任務(wù)進(jìn)行繼續(xù)分割
- 執(zhí)行任務(wù)并合并結(jié)果:分別對(duì)分割的子任務(wù)進(jìn)行處理,然后再對(duì)所有子任務(wù)的結(jié)果進(jìn)行合并。
fork-join 框架的類架構(gòu)圖

類架構(gòu)圖
- ForkJoinTask : 在使用的時(shí)候,我們首先需要?jiǎng)?chuàng)建一個(gè)ForkJoinTask,一般不需要繼承這個(gè)類,java 已提供了兩個(gè)類,只需要繼承他們
- RecursiveTask : 任務(wù)執(zhí)行之后有返回值
- RecursiveAction : 任務(wù)執(zhí)行之后沒(méi)有返回值
- ForkJoinPool : 調(diào)用ForkJoinTask
偽代碼:
class Worker extend RecursiveTask<xxxx>{
@Override
protected xxx compute() {
if (是否滿足條件) {
return executeWorker(); //執(zhí)行任務(wù) ,返回執(zhí)行結(jié)果
}
//不滿足條件那么就分割
Worker worker1= new Worker();
Worker worker2= new Worker();
invokeAll(worker1, worker2); //調(diào)用兩個(gè)worker, 如果不滿足條件內(nèi)部又會(huì)繼續(xù)分割
return worker1.join() + worker2.join();
}
}
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(new Worker());
pool.shutdown();