1.当我们遇到任务量比较大,计算耗时任务可以用该框架充分利用cpu的并行处理快速得到结果!
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
* @program:
* @description: 分任务处理
* @author: sw
* @create: 2020-06-08 23:24
* RecursiveTask是有返回结果的任务!
**/
public class ForkJoinTest extends RecursiveTask<Integer> {
private static final int threshold = 2; //阈值
private int start;
private int end;
public ForkJoinTest(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 mid = (end + start) / 2;
//执行子任务!获取结果
Integer compute1 = new ForkJoinTest(start, mid).fork().join();
Integer compute2 = new ForkJoinTest(mid+1, end).fork().join();
//合并子任务!
sum = compute1 + compute2;
}
return sum;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//forkJoinTask 需要用 forkJoinPool 来执行
ForkJoinPool forkJoinPool = new ForkJoinPool();
//生成一个计算任务,负责计算1+2+3+4+5+6+7+8
ForkJoinTest forkJoinTask = new ForkJoinTest(1,8);
//执行任务!
ForkJoinTask<Integer> result = forkJoinPool.submit(forkJoinTask);
System.out.println(result.get());
}
}