fork/join框架通過利用機器上的多個處理器或多個內(nèi)核來解決問題。
該框架有助于解決涉及并行性的問題。
fork/join框架創(chuàng)建一個線程池來執(zhí)行子任務(wù)。
當線程在子任務(wù)上等待完成時,框架使用該線程來執(zhí)行其他線程的其他未決子任務(wù)。
java.util.concurrent包中的以下四個類是學(xué)習(xí)fork/join框架的核心:
ForkJoinPool類的一個實例表示一個線程池。 ForkJoinTask類的一個實例表示一個任務(wù)。
ForkJoinTask類是一個抽象類。它有兩個具體的子類:RecursiveAction和RecursiveTask。
Java 8添加了一個稱為CountedCompleter的ForkJoinTask類的抽象子類。
該框架支持兩種類型的任務(wù):不產(chǎn)生結(jié)果的任務(wù)和產(chǎn)生結(jié)果的任務(wù)。
RecursiveAction類的實例表示不產(chǎn)生結(jié)果的任務(wù)。 RecursiveTask類的實例表示產(chǎn)生結(jié)果的任務(wù)。
CountedCompleter任務(wù)可能產(chǎn)生結(jié)果,也可能不產(chǎn)生結(jié)果。
這兩個類,RecursiveAction和RecursiveTask,提供了一個抽象的compute()方法。
我們應(yīng)該繼承這些類之一,并為compute()方法提供一個實現(xiàn)。
ForkJoinTask類的以下兩個方法在任務(wù)執(zhí)行期間提供了兩個重要的功能:
fork()方法從異步執(zhí)行的任務(wù)啟動一個新的子任務(wù)。join()方法讓任務(wù)等待另一個任務(wù)完成。
import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class Main { public static void main(String[] args) { ForkJoinPool pool = new ForkJoinPool(); IntSum task = new IntSum(3); long sum = pool.invoke(task); System.out.println("Sum is " + sum); } } class IntSum extends RecursiveTask<Long> { private int count; public IntSum(int count) { this.count = count; } @Override protected Long compute() { long result = 0; if (this.count <= 0) { return 0L; }else if (this.count == 1) { return (long) this.getRandomInteger(); } List<RecursiveTask<Long>> forks = new ArrayList<>(); for (int i = 0; i < this.count; i++) { IntSum subTask = new IntSum(1); subTask.fork(); // Launch the subtask forks.add(subTask); } // all subtasks finish and combine the result for (RecursiveTask<Long> subTask : forks) { result = result + subTask.join(); } return result; } public int getRandomInteger() { return 2; } }
上面的代碼生成以下結(jié)果。
更多建議: