ForkJoin 优化递归任务的适用场景
相关概念:java
ForkJoinPool 真正适合的,不是所有并发任务,而是那种可以不断拆成更小子任务、并且子任务之间相对独立的工作。
例子
快速排序就是很适合拿来理解 ForkJoin 的例子:
- 先选一个分区点
- 左半部分继续排
- 右半部分继续排
这种递归结构天然就能拆成两支并行任务。
为什么它会比单线程快
关键不是“开了多线程”,而是:
- 任务可以递归拆分
- 每个子任务工作量相对均衡
- 多核 CPU 可以同时吃下这些子任务
原始实验里,把千万级数组的快排从大约 800ms 压到 500ms 左右,就是这种场景的典型收益。
心智模型
ForkJoin 的常见写法通常就是:
- 判断任务是否还值得继续拆
- 拆成左、右两个子任务
forkjoin
核心不是 API,而是能不能把问题拆成稳定的递归子问题。
它不适合什么
如果任务:
- 本身不可拆
- 子任务强依赖彼此结果
- 拆分成本过高
- 数据规模太小
那 ForkJoin 很可能只会把代码变复杂。
判断标准
看到一个任务时,如果能够自然地画出一棵“左右分裂、最后汇合”的树,再认真考虑 ForkJoin。