概念
Fork/Join框架是把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果。
示例
实现一个算法,根据输入整数开始值和结束值,求和。求和过程,如果超过10个数就拆分成子任务计算,最后相加。
package com.mine.juc.forkjoin;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class CountTask extends RecursiveTask<Integer> {
private static final long serialVersionUID = 560654139334089964L;
private static final int THRESHHOLD = 10;
private int begin;
private int end;
public static void main(String[] args) throws Exception {
ForkJoinPool pool = new ForkJoinPool();
CountTask task = new CountTask(1, 10000);
ForkJoinTask<Integer> submit = pool.submit(task);
Integer result = submit.get();
System.out.println(result);
pool.shutdown();
}
public CountTask(int begin, int end) {
this.begin = begin;
this.end = end;
}
@Override
protected Integer compute() {
int result = 0;
if (this.end - this.begin <= THRESHHOLD) {
for (int i = this.begin; i <= this.end; i++) {
result += i;
}
} else {
int middle = (this.begin + this.end) / 2;
CountTask leftTask = new CountTask(this.begin, middle);
CountTask rightTask = new CountTask(middle + 1, this.end);
leftTask.fork();
rightTask.fork();
Integer leftResult = leftTask.join();
Integer rightResult = rightTask.join();
result = leftResult + rightResult;
}
return result;
}
}