一、RecursiveAction介绍
通常我们并不直接继承 ForkJoinTask,它包含了太多的抽象方法。针对特定的问题,我们可以选择 ForkJoinTask 的不同子类来完成任务。RecursiveAction 是 ForkJoinTask 的一个子类,它代表了一类最简单的 ForkJoinTask:不需要返回值,当子任务都执行完毕之后,不需要进行中间结果的组合。如果我们从 RecursiveAction 开始继承,那么我们只需要重载 protected void compute() 方法。
注意:我这篇文章是接着上一篇文章的内容写的,如果不了解什么是ForkJoin以及RecursiveTask,可以去我的另外一篇文章了解一下:https://blog.csdn.net/weixin_42146366/article/details/87903230,对你理解这篇《ForkJoin框架之使用RecursiveAction将大任务分解成小任务》会有帮助的!
二、场景模拟
现在使用RecursiveAction求0-50的累加,可以看看与RecursiveTask有什么区别。
代码示例
①、RecursiveActionTest类
package chapter3.forkjoin.recursivetask;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
/**
* @author czd
*/
public class RecursiveActionTest {
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool();
forkJoinPool.submit(new CalculatedRecursiveAction(0,50));
try {
//阻塞当前线程直到 ForkJoinPool 中所有的任务都执行结束
forkJoinPool.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("0-50的总和:" + CalculatedRecursiveAction.SUM);
}
}
②、CalculatedRecursiveAction类:继承了RecursiveAction
package chapter3.forkjoin.recursivetask;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author czd
*/
public class CalculatedRecursiveAction extends RecursiveAction {
private Integer start;
private Integer end;
private Integer Max = 10;
public static AtomicInteger SUM = new AtomicInteger();
public CalculatedRecursiveAction(Integer start , Integer end ) {
this.start = start;
this.end = end;
}
@Override
protected void compute() {
if(end - start <= Max){
for(Integer i = start; i <= end; i++){
SUM .addAndGet(i);
}
}else{
Integer middle = (start + end)/2;
CalculatedRecursiveAction leftTask = new CalculatedRecursiveAction(start , middle);
CalculatedRecursiveAction rightTask = new CalculatedRecursiveAction(middle+1 , end);
//fork()是执行
leftTask.fork();
rightTask.fork();
}
}
}
输出结果