# 下面的代码运行 多线程的计算结果出不来,而且等了很久之后还会卡死,图片就是运行结果,只能出来一个,实在 没看出来问题在哪
package forkJoinPool;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;
/**
* @author liuchaojun
* @date 2018-9-10 下午03:50:24
*/
public class PrintTask2 extends RecursiveTask<Integer> {
private static final long serialVersionUID = 1L;
private static final int INDEX = 50;// 每个小任务执行50个
private int start;
private int end;
private int arr[];
/**
* @param start
* @param end
* @param arr
*/
public PrintTask2(int start, int end, int[] arr) {
this.start = start;
this.end = end;
this.arr = arr;
}
/*
* (non-Javadoc)
* @see java.util.concurrent.RecursiveTask#compute()
*/
@Override
protected Integer compute() {
int sum = 0;
if (end - start < INDEX) {
for (int i = start; i < end; i++) {
sum += arr[i];
}
return sum;
} else {
int middle = (end - start) / 2;
PrintTask2 taskLeft2 = new PrintTask2(start, middle, arr);
PrintTask2 taskRight2 = new PrintTask2(middle, end, arr);
//invokeAll(taskLeft2, taskRight2);
taskLeft2.fork();
taskRight2.fork();
int leftValue = taskLeft2.join();// 当计算完成时返回计算结果。
int rightValue = taskRight2.join();
return leftValue + rightValue;
}
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
int[] arr = new int[200];
Random r = new Random();
int tempSum = 0;//普通总数
for (int i = 0; i < arr.length; i++) {
tempSum += (arr[i]=r.nextInt(10));
}
System.out.println("普通总数结果为:"+tempSum);
PrintTask2 task = new PrintTask2(0, arr.length, arr);
ForkJoinPool pool = new ForkJoinPool();
Future<Integer> sum = pool.submit(task);
System.out.println("多线程的执行结果:"+sum.get());//get 如果需要,等待计算完成,然后检索其结果。
pool.shutdown(); //关闭线程池
}
}