0

0

什么是并发包中的RecursiveAction_ForkJoin框架下无返回值的任务

P粉602998670

P粉602998670

发布时间:2026-02-12 16:29:02

|

694人浏览过

|

来源于php中文网

原创

recursiveaction 是 forkjoinpool 专用的无返回值递归任务抽象类,需继承重写 compute();与 runnable 不同,它支持自动拆分、工作窃取,但必须运行于 forkjoinpool 中,且依赖合理阈值与 fork/join 配合。

什么是并发包中的recursiveaction_forkjoin框架下无返回值的任务

RecursiveAction 是什么,和普通 Runnable 有啥区别

它就是 ForkJoinPool 里专干“不返回结果”的并行活的抽象类,不是接口,不能直接 new,得继承重写 compute()。和 Runnable 表面看着像(都没返回值),但底层完全两码事:Runnable 丢给线程池就完事,RecursiveAction 能自动拆任务、合并子任务、利用工作窃取——前提是你的任务真能递归切分。

  • 必须跑在 ForkJoinPool 里,扔给 Executors.newCachedThreadPool() 会静默失败或抛 IllegalThreadStateException
  • compute() 里不能用 return 传结果,只能改成员变量或外部容器(比如 AtomicIntegerConcurrentHashMap
  • 没切分逻辑硬写 fork() + join() 就是自找死路——任务不会变快,反而因调度开销更慢

什么时候该用 RecursiveAction,而不是 CompletableFuture 或 Stream.parallel()

适合“可自然分治 + 无依赖 + 侧重吞吐”的场景,比如遍历大数组做纯计算、批量解析日志行、图像分块处理。不适合有强顺序、频繁 I/O、或需要链式回调的活。

  • 数据量小(比如 Stream.parallel() 更省心,RecursiveAction 启动成本高
  • 要等中间结果再继续:别硬套,改用 CompletableFuture.supplyAsync() 链式组合
  • 任务之间要共享锁或状态:RecursiveAction 的线程不可控,容易死锁,老老实实用 synchronizedReentrantLock 包住临界区

compute() 里 fork/join 的典型写法和常见崩法

核心就一条:拆到阈值以下才直接算,否则 fork() 子任务,再 join() 等结果。崩点全在边界判断和调用时机上。

Knowt
Knowt

Knowt是一款AI驱动的在线学习工具

下载
  • 忘记 if (end - start 直接递归:栈溢出或任务爆炸,<code>ForkJoinPool 可能 OOM
  • fork() 后没 join():子任务被扔出去就不管了,父任务提前结束,结果丢失
  • join() 放在 fork() 前:串行执行,彻底失去并行意义
  • 示例正确姿势:
    protected void compute() {
        if (end - start <= 1000) {
            processRange(start, end);
            return;
        }
        int mid = (start + end) >>> 1;
        RecursiveAction left = new MyAction(data, start, mid);
        RecursiveAction right = new MyAction(data, mid, end);
        left.fork();  // 先 fork 左
        right.compute(); // 右直接算(避免再 fork)
        left.join();  // 再等左
    }

ForkJoinPool.commonPool() 和自建池的关键差异

默认的 ForkJoinPool.commonPool() 是 JVM 全局共享的,大小由 java.util.concurrent.ForkJoinPool.common.parallelism 控制(通常等于 CPU 核数减一)。你自己的任务混在里面,可能被其他框架(比如 Stream.parallel()CompletableFuture)抢占资源。

  • CPU 密集型任务多且重要:显式创建 new ForkJoinPool(4),避免被挤占
  • 池子太小(比如设成 1):退化成单线程,还多一层调度开销
  • 池子太大(比如设成 100):线程上下文切换压垮性能,ForkJoinPool 不是越大越好
  • 别在 compute() 里调 shutdown():会直接杀掉整个池,连带其他正在跑的任务

实际用的时候,最常被忽略的是阈值设定——它不是拍脑袋定的,得结合数据特征和机器缓存行大小测;还有就是误以为 fork 了就等于并行执行了,其实没 join 就不算真正参与协作。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

1393

2023.10.19

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

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

319

2025.10.17

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

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

2209

2025.12.29

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

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

36

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

653

2023.08.10

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

2

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

43

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

8

2026.02.12

热门下载

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

精品课程

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

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