讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Java里的ForkJoinTask常用子类有哪些_RecursiveTask与Action区别

夏宇酱_5551

夏宇酱_5551

发布时间:2026-02-27 08:04:03

|

381人浏览过

|

来源于php中文网

原创

选RecursiveTask还是RecursiveAction取决于是否有返回值:有结果用RecursiveTask(需指定泛型并return值),无结果用RecursiveAction(compute()返回void);二者均为ForkJoinTask子类,不可直接实例化抽象父类。

java里的forkjointask常用子类有哪些_recursivetask与action区别

RecursiveTask 和 RecursiveAction 到底选哪个? 看返回值:有结果就用 RecursiveTask,没结果就用 RecursiveAction。不是风格偏好,是类型强约束——RecursiveAction 的 compute() 方法返回 void,硬塞 return 语句会编译失败;而 RecursiveTask<t></t> 必须指定泛型,并在 compute() 里返回对应类型的值。
  • 求和、找最大值、归并排序的合并阶段 → 用 RecursiveTask<integer></integer> 或 RecursiveTask<list>></list>
  • 遍历树节点打日志、批量更新对象状态、初始化数组元素 → 用 RecursiveAction
  • 别试图在 RecursiveAction 里靠成员变量“攒结果”:多线程下不安全,且违背 Fork/Join 的任务隔离设计原则

为什么不能直接 new ForkJoinTask()?ForkJoinTask 是抽象类,没有实现 compute(),也没提供默认任务调度逻辑。JVM 不知道这个“空壳任务”该 fork 什么、join 什么、怎么拆分。
  • 所有自定义任务必须继承 RecursiveTask 或 RecursiveAction,二者已封装了:
    • fork() / join() 的线程池上下文绑定
    • invoke() 调用时的阻塞等待机制
    • 工作窃取(work-stealing)所需的内部状态标记(如 status 字段)
  • 直接 extends ForkJoinTask 属于高阶定制,99% 的业务场景没必要,还容易漏掉关键 hook 点(比如忘记调用 setRawResult())

常见踩坑:compute() 里忘了 fork/join 或写错顺序 典型错误是把子任务当成普通方法调用,或者 join() 写在 fork() 前面,导致串行执行甚至死锁。
  • 正确模式(以 RecursiveTask<integer></integer> 为例):
    protected Integer compute() {
      if (end - start <= THRESHOLD) {
        return sumDirectly();
      }
      int mid = (start + end) / 2;
      RecursiveTask<Integer> left = new SumTask(data, start, mid);
      RecursiveTask<Integer> right = new SumTask(data, mid, end);
      left.fork();   // 异步提交左任务
      int rightResult = right.compute(); // 当前线程算右任务(避免额外线程开销)
      int leftResult = left.join();      // 等左任务结果
      return leftResult + rightResult;
    }
  • 错误写法:
    • left.compute(); right.compute(); → 完全串行,失去并行意义
    • left.join(); left.fork(); → 先 join 一个还没 fork 的任务,永远卡住
    • 在 RecursiveAction 的 compute() 里调用 get() → 编译不过,它没继承 Future 接口

ForkJoinPool 提交任务时,invoke() 和 submit() 有什么实际区别? 核心在于调用线程是否阻塞,以及返回值类型不同。
  • invoke(task):
    • 当前线程同步阻塞,直到任务完成
    • 返回 task 的计算结果(RecursiveTask)或 null(RecursiveAction)
    • 适合主流程必须等结果才能继续的场景,比如接口响应前必须拿到聚合结果
  • submit(task):
    • 立即返回 ForkJoinTask 实例(本质是 Future 子类)
    • 调用方需手动 task.join() 或 task.get() 获取结果
    • 适合需要异步触发、后续再择机获取结果的场景,比如后台预热、事件驱动处理

别忽略一点:无论用哪个提交方式,任务内部的 fork()/join() 行为都只在 ForkJoinPool 的工作线程中生效;如果在普通线程里调用 fork(),任务会直接被丢弃(无报错),这是最容易被忽略的静默失效点。

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

569

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

391

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5449

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3909

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

506

2026.01.19

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn