1. RecursiveTask: 有返回值的ForkJoin;需要估算多大的“划分值”合适。否则,可能导致花费的时间和资源较大。
public class ForkJoinRecursiveTask {
private static final int MAX_THREAD_HOLED = 200;
public static void main(String[] args) throws ExecutionException, InterruptedException {
final int MAX_NUMBER = 1000;
final ForkJoinPool forkJoinPool = new ForkJoinPool();
MyRecursiveTask recursiveTask = new MyRecursiveTask(1, MAX_NUMBER);
ForkJoinTask<Long> task = forkJoinPool.submit(recursiveTask);
Long sum = task.get();
System.out.println("sum: " + sum);
}
static class MyRecursiveTask extends RecursiveTask<Long> {
private final int start;
private final int end;
public MyRecursiveTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if ((end - start) <= MAX_THREAD_HOLED) {
return (long) IntStream.rangeClosed(start, end).sum();
} else {
int middle = (end + start) / 2;
MyRecursiveTask leftTask = new MyRecursiveTask(start, middle);
MyRecursiveTask rightTask = new MyRecursiveTask(middle + 1, end);
leftTask.fork();
rightTask.fork();
return leftTask.join() + rightTask.join();
}
}
}
}
2. RecursiveAction 无返回值的ForkJoin.
public class ForkJoinRecursiveAction {
private static final int MAX_THREAD_HOLED = 200;
private static AtomicLong sum = new AtomicLong(0);
public static void main(String[] args) throws InterruptedException {
final int MAX_NUMBER = 1000;
final ForkJoinPool forkJoinPool = new ForkJoinPool();
MyRecursiveAction recursiveAction = new MyRecursiveAction(1, MAX_NUMBER);
forkJoinPool.submit(recursiveAction);
forkJoinPool.awaitTermination(2, TimeUnit.SECONDS);
System.out.println("SUM: " + sum.get());
}
static class MyRecursiveAction extends RecursiveAction {
private final int start;
private final int end;
public MyRecursiveAction(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected void compute() {
if ((end - start) <= MAX_THREAD_HOLED) {
sum.addAndGet(IntStream.rangeClosed(start, end).sum());
} else {
int middle = (end + start) / 2;
MyRecursiveAction leftTask = new MyRecursiveAction(start, middle);
MyRecursiveAction rightTask = new MyRecursiveAction(middle + 1, end);
leftTask.fork();
rightTask.fork();
}
}
}
}