ForkJoinPool 为「分治任务」设计:大任务递归拆小(fork),子结果合并(join)。核心是工作窃取:每个工作线程拥有自己的双端队列,线程产生的子任务 push 到自己队列头部并优先从头部取(LIFO,利于缓存局部性);当自己队列空了,就去随机偷取其他线程队列尾部的任务(FIFO)——头部自己取、尾部被偷,两端操作天然减少竞争。队列全局均衡,避免忙闲不均。

适用场景与边界:适合 CPU 密集、可递归拆分、任务间无阻塞 的计算(排序、大规模遍历、并行流)。注意事项:1)任务中不能做阻塞 I/O——窃取机制假设线程总在算,阻塞会让池饿死(阻塞任务请用普通线程池);2)拆分的粒度要有阈值,任务太小则调度开销超过收益;3)commonPool 的坑——parallelStream、CompletableFuture 默认共用全局 commonPool,一处提交阻塞/重任务会拖累全应用,生产上应为关键任务指定独立池;4)ForkJoinTask 异常不会自动抛出,要用 join 时的 ExecutionException 或显式检查。追问方向:工作窃取队列两端操作如何用 CAS 实现无锁化、与 ExecutorService 单共享队列的对比(竞争点数量)、递归任务过深的栈问题。

(约 440 字)