1. 简介
Fork/Join它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join框架要完成两件事情:
- Fork:把一个复杂任务进行分拆,大事化小
- Join:把分拆任务的结果进行合并.
2. 举例
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class 分支合并测试 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyTask task = new MyTask(1,100);
//创建分支合并池对象
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(task);
//获取最终合并之后的结果
Integer result = forkJoinTask.get();
System.out.println(result);
//关闭池对象
forkJoinPool.shutdown();
}
}
class MyTask extends RecursiveTask<Integer> {
//拆分差值不能超过10,计算10以内的运算
private static final Integer VALUE = 10;
private int begin;//拆分开始值
private int end;//拆分结束的值
private int result = 0;//返回结果
//创建一个有参数的构造
public MyTask(int begin, int end) {
this.begin = begin;
this.end = end;
}
//拆分和合并过程
@Override
protected Integer compute() {
//判断相加的两个数的差值是否大于10
if ((end - begin) <= VALUE) {
//相加操作
for (int i = begin; i <= end; i++) {
result += i;
}
} else {
//进一步拆分
//获取中间值
int middle = (begin + end) / 2;
//拆分左边部分
MyTask task1 = new MyTask(begin, middle);
//拆分右边部分
MyTask task2 = new MyTask(middle + 1, end);
//调用方法拆分
task1.fork();
task2.fork();
//合并结果
result = task1.join() + task2.join();
}
return result;
}
}