分治法fork()
public class Test {
public static final int THRESHOLD = 10;
static class CountTask extends RecursiveTask<Long> {
private static final long serialVersionUID = 5858564021273368011L;
private long start;
private long end;
public CountTask(long start, long end) {
System.out.println(start+" "+end);
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
long sum = 0;
boolean canCompute = (end - start) <= THRESHOLD;
if (canCompute) {
for (long i = start; i <= end; i++) {
sum += i;
}
} else {
long step = (start + end) / THRESHOLD;
ArrayList<CountTask> subTasks = new ArrayList<>();
long pos = 0;
for (int i = 0; i < step+1; i++) {
pos = start+ step*i;
long lastOne = pos + step-1;
if (lastOne > end)
lastOne = end;
CountTask subTask = new CountTask(pos, lastOne);
subTasks.add(subTask);
subTask.fork();
}
for (CountTask t : subTasks) {
sum += t.join();
}
}
return sum;
}
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ForkJoinPool pool=new ForkJoinPool();
CountTask t =new CountTask(0,100L);
ForkJoinTask<Long> result = pool.submit(t);
System.out.println(result.get());
}
}