什么是ForkJoin?看这一篇就能掌握!( 三 )


我们可以使用下图来表示这个过程 。

什么是ForkJoin?看这一篇就能掌握!

文章插图
ForkJoinTask有3个子类:
什么是ForkJoin?看这一篇就能掌握!

文章插图
  • RecursiveAction:无返回值的任务 。
  • RecursiveTask:有返回值的任务 。
  • CountedCompleter:完成任务后将触发其他任务 。
4.RecursiveTask<V> 类有返回结果的ForkJoinTask实现Callable 。
5.RecursiveAction类无返回结果的ForkJoinTask实现Runnable 。
6.CountedCompleter<T> 类在任务完成执行后会触发执行一个自定义的钩子函数 。
ForkJoin示例程序package io.binghe.concurrency.example.aqs;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.Future;import java.util.concurrent.RecursiveTask;@Slf4jpublic class ForkJoinTaskExample extends RecursiveTask<Integer> { public static final int threshold = 2; private int start; private int end; public ForkJoinTaskExample(int start, int end) { this.start = start; this.end = end; } @Override protected Integer compute() { int sum = 0; //如果任务足够小就计算任务 boolean canCompute = (end - start) <= threshold; if (canCompute) { for (int i = start; i <= end; i++) {                sum += i; } } else { // 如果任务大于阈值,就分裂成两个子任务计算 int middle = (start + end) / 2; ForkJoinTaskExample leftTask = new ForkJoinTaskExample(start, middle); ForkJoinTaskExample rightTask = new ForkJoinTaskExample(middle + 1, end); // 执行子任务 leftTask.fork(); rightTask.fork(); // 等待任务执行结束合并其结果 int leftResult = leftTask.join(); int rightResult = rightTask.join(); // 合并子任务            sum = leftResult + rightResult; } return sum; } public static void main(String[] args) { ForkJoinPool forkjoinPool = new ForkJoinPool(); //生成一个计算任务,计算1+2+3+4 ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100); //执行一个任务 Future<Integer> result = forkjoinPool.submit(task); try {            log.info("result:{}", result.get()); } catch (Exception e) { log.error("exception", e); } }}点击关注,第一时间了解华为云新鲜技术~

推荐阅读