思路:可以new ForkJoinPool,再通过继承RecursiveTask/RecursiveAction,将其放入ForkJoinPool,求得结果。
首先新建一个MakeArray的类,该类是负责提供数组的一个类。
public class MakeArray {
//数组的长度为ARRAY_LENGTH
public static final int ARRAY_LENGTH=100000000;
public static int[] makeArray(){
Random random = new Random();
int [] result=new int[ARRAY_LENGTH];
for(int i=0;i<ARRAY_LENGTH;i++){
result[i]=random.nextInt(ARRAY_LENGTH*3);
}
return result;
}
}
接下来我们通过继承RecursiveTask类来计算该数组的总和
public class SumArray {
private static class SumTask extends RecursiveTask<Integer> {
//自己定义的区间的长度
private final static int THRESHOLD=MakeArray.ARRAY_LENGTH/10;
private int src[];
// 起始的下标
private int fromIndex;
//结束的下标
private int toIndex;
public SumTask(int[] src, int fromIndex, int toIndex) {
this.src = src;
this.fromIndex = fromIndex;
this.toIndex = toIndex;
}
@Override
protected Integer compute() {
//如果(结束下标-起始下标<定义的区间的长度的话)那么就可以累加求和
if(toIndex-fromIndex<THRESHOLD){
int count=0;
for(int i=fromIndex;i<toIndex;i++){
/*try {
Thread.currentThread().sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
count=count+src[i];
}
return count;
}else{
//如果大于区间的长度的话,平分,递归
int mid=(fromIndex+toIndex)/2;
SumTask left=new SumTask(src,fromIndex,mid);
SumTask right=new SumTask(src,mid+1,toIndex);
invokeAll(left,right);
return left.join()+right.join();
}
}
}
public static void main(String[] args) {
ForkJoinPool pool=new ForkJoinPool();
int src[]=MakeArray.makeArray();
SumTask innerFind=new SumTask(src,0,src.length-1);
long start=System.currentTimeMillis();
pool.invoke(innerFind);
System.out.println("Task is Running ..............");
System.out.println("The count is "+innerFind.join()+"spend time is:"+(System.currentTimeMillis()-start)+"ms");
}
}
这样便求得数组的总和。