package com.example.sina.thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.IntStream;
public class RecursiveTest {
// 定義最小區間爲10
private final static int MAX_THRESHOLD = 100;
public static void main(String[] args) {
final ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Integer> future = forkJoinPool.submit(new CalculateRecursiveTask(1, 1000));
try {
Integer result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
private static class CalculateRecursiveTask extends RecursiveTask<Integer> {
private static final long serialVersionUID = 1L;
// 起始
private int start;
// 結束
private int end;
public CalculateRecursiveTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
// 如果起始和結束範圍小於我們定義的區間範圍,則直接計算
if ((end - start) <= MAX_THRESHOLD) {
return IntStream.rangeClosed(start, end).sum();
} else {
// 否則,將範圍一分爲二,分成兩個子任務
int middle = (start + end) / 2;
CalculateRecursiveTask leftTask = new CalculateRecursiveTask(start, middle);
CalculateRecursiveTask rightTask = new CalculateRecursiveTask(middle + 1, end);
// 執行子任務
leftTask.fork();
rightTask.fork();
// 彙總子任務
return leftTask.join() + rightTask.join();
}
}
}
}