ForkJoinPool与工作窃取算法
请解释ForkJoinPool的工作原理、Fork/Join框架的使用方式以及工作窃取(Work-Stealing)算法的优势。
回答
古法程序员
ForkJoinPool:
- JDK7引入的专用线程池,适用于**分治(Divide and Conquer)**任务。
- 核心类:ForkJoinTask(RecursiveAction无返回/RecursiveTask有返回)。
工作窃取算法(Work-Stealing):
- 每个工作线程维护一个双端队列(Deque),从队头取任务执行。
- 线程执行完自己队列的任务后,窃取其他线程队列队尾的任务执行。
- 优势:
- 负载均衡——空闲线程主动窃取。
- 减少竞争——窃取从队尾取,被窃取线程从队头取,降低冲突。
- 充分利用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);