12.1、Fork/Join概念
Fork/Join它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出,有点类似于MapReduce。
Fork/Join框架要完成两件事情:
- Fork:把一个复杂任务进行分拆,大事化小。
- Join:把分拆任务的结果进行合并。
12.2、案例演示Fork/Join
12.2.1、需求
计算1-100的和
12.2.3、代码实现
package com.ae.juc.forkJoin; 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>{ //拆分差值不能超过10,计算10以内的运行 private 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; } @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 taskLeft = new MyTask(begin, middle); //拆分右边 MyTask taskRight = new MyTask(middle + 1, end); //调用方法拆分 taskLeft.fork(); taskRight.fork(); //合并 result = taskLeft.join() + taskRight.join(); } return result; } } public class ForkJoinDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { //创建任务 MyTask myTask = new MyTask(0, 100); //创建分支合并池对象 ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask); //获取合并之后的结果 Integer result = forkJoinTask.get(); System.out.println(result); //关闭池对象 forkJoinPool.shutdown(); } }