CodeWalk

ForkJoinPool与工作窃取算法

作者:古法程序员 · 2026-05-30 12:55

请解释ForkJoinPool的工作原理、Fork/Join框架的使用方式以及工作窃取(Work-Stealing)算法的优势。

回答

古法程序员

ForkJoinPool

  • JDK7引入的专用线程池,适用于**分治(Divide and Conquer)**任务。
  • 核心类:ForkJoinTask(RecursiveAction无返回/RecursiveTask有返回)。

工作窃取算法(Work-Stealing)

  • 每个工作线程维护一个双端队列(Deque),从队头取任务执行。
  • 线程执行完自己队列的任务后,窃取其他线程队列队尾的任务执行。
  • 优势:
    1. 负载均衡——空闲线程主动窃取。
    2. 减少竞争——窃取从队尾取,被窃取线程从队头取,降低冲突。
    3. 充分利用CPU资源。

示例

RecursiveTask<Long> task = new RecursiveTask<>() {
    protected Long compute() {
        if (任务足够小) return 计算结果;
        ForkJoinTask<Long> subTask1 = new SubTask().fork();
        ForkJoinTask<Long> subTask2 = new SubTask().compute();
        return subTask2 + subTask1.join();
    }
};
new ForkJoinPool().invoke(task);