/** * @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); } }