/**
* @Author zh
* @Description 利用Fork-Join计算1-100的和 ,会把数组放入数组
* @Date 2021/12/14
*/
/*
一个大的任务拆分成多个子任务进行并行处理,
最后将子任务结果合并成最后的计算结果,并进行输出。
*/
public class MyTask extends RecursiveTask<Integer>{
//拆分的标准
private static final int COUNT=5;
//定义原数组
private int[] source;
//开始下标
private int startIndex;
//结束下标
private int endIndex;
public MyTask(int[] source, int startIndex, int endIndex) {
this.source = source;
this.startIndex = startIndex;
this.endIndex = endIndex;
}
//拆分的方法
@Override
protected Integer compute() {
//1.判断标准
if (endIndex-startIndex<=COUNT){
//总和
int sum =0;
for (int i=startIndex;i<=endIndex;i++){
sum+=source[i];
}
return sum;
}else {
int mid=(endIndex+startIndex)/2;
MyTask left =new MyTask(source,startIndex,mid);
MyTask right =new MyTask(source,mid+1,endIndex);
//继续用递归 invokeAll();
left.fork();
right.fork();
//进行合并
return left.join()+right.join();
}
}
}
public class TMain {
public static void main(String[] args) {
int[] arr =new int[101];
for (int i = 0; i < 101; i++) {
arr[i]=i;
}
System.out.println(Arrays.toString(arr));
//1.任务池
ForkJoinPool pool =new ForkJoinPool();
//2.任务
MyTask myTask =new MyTask(arr,0,arr.length-1);
//3.把任务交给池管理
pool.invoke(myTask);
//4.获取结果
Integer join = myTask.join();
System.out.println(join);
}
}