原理:
Fork:把一個複雜任務進行分拆,大事化小
Join:把分拆任務的結果進行合併
java
相關類
ForkJoinPool
分支合併池 類比=> 線程池
ide
ForkJoinTask
ForkJoinTask 類比=> FutureTaskthis
RecursiveTask
遞歸任務:繼承後能夠實現遞歸(本身調本身)調用的任務spa
示例1:線程
class Fibonacci extends RecursiveTask<Integer> { final int n; Fibonacci(int n) { this.n = n; } public 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(); } }
實例代碼
import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; class MyTask extends RecursiveTask<Integer> { private static final Integer ADJUST_VALUE = 10; private int begin; private int end; private int result; public MyTask(int begin, int end) { this.begin = begin; this.end = end; } @Override protected Integer compute() { //10個數之內的不用ForkJoin if((end-begin)<=ADJUST_VALUE){ for (int i = begin; i <= end; i++) { result=result+i; } }else{ int middle=(end+begin)/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; } } /** * 分支合併例子 * ForkJoinPool * ForkJoinTask * RecursiveTask */ public class ForkJoinDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { MyTask myTask=new MyTask(0,100); ForkJoinPool threadPool=new ForkJoinPool(); ForkJoinTask<Integer> forkJoinTask = threadPool.submit(myTask); Integer result = forkJoinTask.get(); System.out.println(result); threadPool.shutdown(); //ForkJoinPool; //ForkJoinTask; } }