package com.jia.concurrency;
import java.util.ArrayList;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class CountTask extends RecursiveTask{
private static final int THRESHOLD=10000;
private long start;
private long end;
public CountTask(long start,long end) {
this.start=start;
this.end=end;
}
@Override
protected Long compute() {
long sum=0;
boolean canCompute=(end-start)
if (canCompute) {
for (long i =start; i <=end;i++) {
sum+=i;
}
}else{
//分成100个小任务
long step=(start+end)/100;
ArrayList subTasks=new ArrayList();
long pos=start;
for (int i = 0; i <100; i++) {
long lastOne=pos+step;
if (lastOne>end) {
lastOne=end;
}
CountTask subTask=new CountTask(pos, lastOne);
pos+=step+1;
subTasks.add(subTask);
subTask.fork();
}
for (CountTask countTask : subTasks) {
sum+=countTask.join();
}
}
return sum;
}
public static void main(String[] args) {
ForkJoinPool forkJoinPool=new ForkJoinPool();
CountTask task=new CountTask(0, 200000L);
ForkJoinTask result=forkJoinPool.submit(task);
try {
long res=result.get();
System.err.println("sum="+res);
} catch (Exception e) {
e.printStackTrace();
}
}
}