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

文章插图
ForkJoinTask有3个子类:

文章插图
- RecursiveAction:无返回值的任务 。
- RecursiveTask:有返回值的任务 。
- CountedCompleter:完成任务后将触发其他任务 。
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); } }}点击关注,第一时间了解华为云新鲜技术~
推荐阅读
- 云顶之弈龙境探秘活动玩法是什么
- 无悔华夏渔樵问答9月8日答案是什么
- iqoo8为什么不值得买_iqoo8不值得买的原因
- R7 5800U核显相当于什么显卡_R7 5800U核显什么水平
- dnf勋章和守护珠怎么获得(100版本瞎子勋章守护珠选什么)
- 一 Linux--多线程
- 妄想山海封蹄的获取方法是什么
- 纯小数是什么 小数含义是
- 十大经典鸡尾酒暗语-十大经典鸡尾酒是什么?
- 新手玩饥荒前期中期后期都应该干什么,地图应该玩什么