public class SumTask extends RecursiveTask<Long>{ //每次进行任务分解都必须有起始元素和终止元素 private int start;
private int end;
private int step = 20; //步长,任务最小分到20个数来运算
public SumTask() {
}
public SumTask(int start, int end) { this.start = start;
this.end = end; }
@Override protected Long compute() { long sum= 0;
if(end-start<=step){ for (int i = start; i <= end; i++) {
sum+=i; }
}else{ int mid = (start+end)/2; SumTask leftTask = new SumTask(start, mid); SumTask rightTask = new SumTask(mid+1, end); //我们只管把分任务的规则告诉他就行
//他会再次调用SumTask的compute()方法,一级一级往下分,分到符合我们条件为止。 leftTask.fork(); rightTask.fork();
//在做一件事 Long leftResult = leftTask.join(); Long rightResult = rightTask.join();
sum = leftResult+rightResult; } return sum; }
public static void main(String[] args) throws ExecutionException, InterruptedException { // //只有一个核在使用的运算任务
// int sum=0;
// for (int i = 0; i < 1000; i++) {
// sum+=i;
// }
// System.out.println(sum);
//创建一个ForkJoin线程池 ForkJoinPool pool = new ForkJoinPool(); //算算花了多少时间 long startTime = System.currentTimeMillis();
//使用线程池 RecursiveTask<Long> task = new SumTask(1,1000000); Future<Long> future = pool.submit(task);//只要涉及到返回值的都要把结果返回给Future
Long result = future.get(); System.out.println(result); //算时间 long endTime = System.currentTimeMillis(); System.out.println("耗费时间pool:" + (endTime - startTime)); //关闭 pool.shutdown(); }