public class PlusWithForkJoinTask extends RecursiveTask<Integer> {
private static final int STEP = 200;
private int startNum;
private int endNum;
public PlusWithForkJoinTask(int startNum, int endNum) {
super();
this.startNum = startNum;
this.endNum = endNum;
}
public int getStartNum() {
return startNum;
}
public void setStartNum(int startNum) {
this.startNum = startNum;
}
public int getEndNum() {
return endNum;
}
public void setEndNum(int endNum) {
this.endNum = endNum;
}
@Override
protected Integer compute() {
// 不超过200个整数直接相加
if (endNum - startNum < STEP) {
// 计算从startNum 到endNum的和
int result = 0;
for (int i = startNum; i <= endNum; i++) {
result = result + i;
}
return result;
}
// 超过200个整数,拆分成两半分别计算,再汇总
else {
PlusWithForkJoinTask task1 = new PlusWithForkJoinTask(startNum, (endNum + startNum) / 2);
task1.fork();
PlusWithForkJoinTask task2 = new PlusWithForkJoinTask((endNum + startNum) / 2 + 1, endNum);
task2.fork();
return task1.join() + task2.join();
}
}
public static void main(String[] args) {
PlusWithForkJoinTask task = new PlusWithForkJoinTask(1, 2000);
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Integer> futureTask = pool.submit(task);
System.out.println(futureTask.invoke());
}
}