核心区别在于RecursiveTask的join()返回子任务结果用于合并,RecursiveAction的join()无返回值不参与汇总;归并排序等需结果合并的任务必须用RecursiveTask,批量修改等无需汇总的任务适合RecursiveAction。

核心区别在于:RecursiveTask 的 join() 能拿到子任务的计算结果,用于后续合并;RecursiveAction 的 join() 没有返回值,无法参与结果组装——它压根不产生可汇总的值。
结果汇总是否必要,决定了选哪个
归并排序、数组求和、最大值查找等场景,必须把左右子任务的结果“合起来”才能得到最终答案,这类任务天然需要返回值,必须用 RecursiveTask
而批量修改数组元素、日志写入、状态标记等操作,目标是“做完就行”,不需要把每个子段的执行结果再拼起来,这时 RecursiveAction 更轻量、更直接。
join() 行为差异一目了然
- RecursiveTask.join():阻塞等待子任务完成,并返回其 compute() 中 return 的值(如 int[]、Long、Boolean)
- RecursiveAction.join():也阻塞等待子任务完成,但方法签名是 void,调用后无任何值可取
这意味着,如果你写了 leftTask.join() + rightTask.join(),编译器会直接报错——因为 rightTask 如果是 RecursiveAction 类型,.join() 不返回任何东西,加法运算无法进行。
错误混用的典型后果
把本该返回子数组的归并任务写成 RecursiveAction,表面能跑通,但 merge 阶段会因缺少左/右有序段而崩溃或返回乱序结果;反过来,给一个纯打印任务套 RecursiveTask
真正关键的判断依据就一条:这个任务的输出,是不是上层合并步骤的输入? 是,选 RecursiveTask;否,选 RecursiveAction。

















