残酷乐团
162.00 MB · 2025-10-07
java.util.concurrent
包下 。ForkJoinPool
RecursiveTask<V>
protected abstract V compute()
方法。RecursiveAction
compute()
方法。假设我们要求 1 + 2 + ... + 1000
的和,可以用 Fork/Join 来并行计算:
import java.util.concurrent.*;
public class ForkJoinTest {
public static void main(String[] args) throws Exception {
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Long> task = new MyTask(1, 1000);
Long result = pool.invoke(task);
System.out.println("结果: " + result);
}
}
class MyTask extends RecursiveTask<Long> {
private long start;
private long end;
private static final long THRESHOLD = 100; // 阈值,任务足够小就不拆分
public MyTask(long start, long end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
long sum = 0;
// 如果任务足够小,直接计算
if ((end - start) <= THRESHOLD) {
for (long i = start; i <= end; i++) {
sum += i;
}
return sum;
} else {
// 任务太大,拆分为两个小任务
long mid = (start + end) / 2;
MyTask left = new MyTask(start, mid);
MyTask right = new MyTask(mid + 1, end);
// fork 子任务(异步执行)
left.fork();
right.fork();
// join 合并结果(等待子任务完成并返回)
return left.join() + right.join();
}
}
}
MyTask(1,1000)
太大 → 拆分成 MyTask(1,500)
和 MyTask(501,1000)
join()
把结果逐级汇总递归拆分任务 → 小任务直接执行 → 结果汇总。
如果某个线程执行完了,会去偷其他线程队列里的任务,提升 CPU 利用率。
ForkJoinWorkerThread
)都有一个 双端队列(Deque) 来存放任务。比如大数据计算、数组求和、递归处理。
Fork/Join 框架 = 多线程版的递归分治,背后依赖 ForkJoinPool 和 工作窃取算法 来保证高效执行。