原理:
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; } }