【JUC并发编程12】Fork与Join分支
生活随笔
收集整理的這篇文章主要介紹了
【JUC并发编程12】Fork与Join分支
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
12 Fork 與 Join分支
將一個大的任務拆分成多個子任務進行并行處理,最后將子任務結果合并成最后的計算結果。
該算法相當于遞歸,且是二分查找思路
class Fibonacci extends RecursiveTask<Integer> {final int n;Fibonacci(int n) { this.n = n; }Integer compute() {if (n <= 1)return n;Fibonacci f1 = new Fibonacci(n - 1);// 分支f1.fork();Fibonacci f2 = new Fibonacci(n - 2);// 合并return f2.compute() + f1.join();}}Fork:把一個復雜任務進行分拆,大事化小
Join:把分拆任務的結果進行合并
ForkJoinTask:我們要使用 Fork/Join 框架,首先需要創建一個 ForkJoin 任務。該類提供了在任務中執行 fork 和 join 的機制。通常情況下我們不需要直接集成 ForkJoinTask 類,只需要繼承它的子類,Fork/Join 框架提供了兩個子類:
RecursiveAction:用于沒有返回結果的任務
RecursiveTask:用于有返回結果的任務
ForkJoinPool:ForkJoinTask 需要通過 ForkJoinPool 來執行
RecursiveTask:繼承后可以實現遞歸(自己調自己)調用的任務
創建分支合并對象 通過該對象調用內部方法
具體案例:1加到100,相加兩個數值不能大于10
class MyTask extends RecursiveTask<Integer> {// 拆分差值不能超過10private static final Integer VALUE = 10;private int begin;private int end;private int result;public MyTask(int begin, int end){this.begin = begin;this.end = end;}@Overrideprotected Integer compute() {// 判斷兩個值的差值是否大于10if((end-begin)<=10) {// 相加操作for (int i = begin; i <= end ; i++) {result = result + i;}} else {// 大于10 繼續拆分int middle = (begin + end) / 2;// 拆分左邊MyTask task01 = new MyTask(begin, middle);// 拆分右邊MyTask task02 = new MyTask(middle + 1, end);// 調用方法拆分task01.fork();task02.fork();// 合并結果result = task01.join() + task02.join();}return result;} }public class ForkJoinTest {public static void main(String[] args) throws ExecutionException, InterruptedException {// 創建MyTask對象MyTask task = new MyTask(0, 100);// 創建分支合并池對象ForkJoinPool forkJoinPool = new ForkJoinPool();ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(task);// 獲取最終合并之后結果Integer reslut = forkJoinTask.get();System.out.println(reslut);} }輸出結果:
5050
總結
以上是生活随笔為你收集整理的【JUC并发编程12】Fork与Join分支的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JUC并发编程11】线程池
- 下一篇: 【JUC并发编程13】异步回调