Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子 任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:
Fork:把一个复杂任务进行分拆,大事化小
Join:把分拆任务的结果进行合并
1. 任务分割 :首先 Fork/Join 框架需要把大的任务分割成足够小的子任务,如果
子任务比较大的话还要对子任务进行继续分割
2. 执行任务并合并结果 :分割的子任务分别放到双端队列里,然后几个启动线程
分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,
启动一个线程从队列里取数据,然后合并这些数据。
在 Java 的 Fork/Join 框架中,使用两个类完成上述操作
计算1到100相加的结果,以10个为一轮,分支合并相加
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
* @author zhang.rongshan
* @create 2022-01-04 下午11:03
*/
class MyFork extends RecursiveTask<Integer> {
//拆分差值不超过10,计算10以内运算
private static final Integer Vaule = 10;
private int begin; //拆分开始
private int end; //拆分结束
private int result;//返回结果
public MyFork(int begin, int end) {
this.begin = begin;
this.end = end;
}
@Override
protected Integer compute() {
if ((end - begin) <= Vaule) {
//相加操作
for (int i = begin; i <= end; i++) {
result = result + i;
}
} else {
//获取中间值
int middle = (begin + end) / 2;
//拆分左边
MyFork myFork1 = new MyFork(begin, middle);
//拆分右边
MyFork myFork2 = new MyFork(middle + 1, end);
//调用方法拆分
myFork1.fork();
myFork2.fork();
//合并结果
result = myFork1.join() + myFork2.join();
}
return result;
}
}
public class ForkJoinDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建MyFork对象
MyFork myFork = new MyFork(0,100);
//创建分支合并池对象
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Integer> joinTask = forkJoinPool.submit(myFork);
Integer result = joinTask.get();
System.out.println("获取最后的结果"+result);
//关闭池对象
forkJoinPool.shutdown();
}
}










