0

0

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

P粉602998670

P粉602998670

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

|

381人浏览过

|

来源于php中文网

原创

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

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

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

为什么不能直接 new ForkJoinTask()?ForkJoinTask 是抽象类,没有实现 compute(),也没提供默认任务调度逻辑。JVM 不知道这个“空壳任务”该 fork 什么、join 什么、怎么拆分。
  • 所有自定义任务必须继承 RecursiveTaskRecursiveAction,二者已封装了:
    • 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 的任务,永远卡住
    • RecursiveActioncompute() 里调用 get() → 编译不过,它没继承 Future 接口

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

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

FineCam
FineCam

FineShare平台的推出的AI虚拟摄像头,可以将任何摄像头转换为高质量的网络摄像头

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

248

2023.09.22

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

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

906

2024.03.01

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

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

183

2023.11.23

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

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

125

2025.11.27

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

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

1679

2023.10.19

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

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

506

2025.10.17

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

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

2314

2025.12.29

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

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

41

2026.01.19

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.2万人学习

Java 教程
Java 教程

共578课时 | 72.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号