什么是Fork/Join?

作者:karry_k日期:2025/10/3

ForkJoin

Fork/Join 是什么?

  • 它是Java7 引入的一个 并行计算框架, 位于 java.util.concurrent 包下 。
  • 主要解决的问题是:把大任务拆分成多个小任务并行执行,然后合并结果。
  • 核心思想:分治法+工作窃取

核心类

  1. ForkJoinPool
    • 一个特殊的线程池,支持“工作窃取”算法。
    • 每个线程都有自己的任务队列,如果某个线程空闲,会去偷别人的任务执行
  1. RecursiveTask<V>
    • 代表有返回值的任务。
    • 必须重写 protected abstract V compute() 方法。
  1. RecursiveAction
    • 代表没有返回值的任务。
    • 也要重写 compute() 方法。

使用步骤

假设我们要求 1 + 2 + ... + 1000 的和,可以用 Fork/Join 来并行计算:

1import java.util.concurrent.*;
2
3public class ForkJoinTest {
4    public static void main(String[] args) throws Exception {
5        ForkJoinPool pool = new ForkJoinPool();
6        ForkJoinTask<Long> task = new MyTask(1, 1000);
7        Long result = pool.invoke(task);
8        System.out.println("结果: " + result);
9    }
10}
11
12class MyTask extends RecursiveTask<Long> {
13    private long start;
14    private long end;
15    private static final long THRESHOLD = 100; // 阈值,任务足够小就不拆分
16
17    public MyTask(long start, long end) {
18        this.start = start;
19        this.end = end;
20    }
21
22    @Override
23    protected Long compute() {
24        long sum = 0;
25        // 如果任务足够小,直接计算
26        if ((end - start) <= THRESHOLD) {
27            for (long i = start; i <= end; i++) {
28                sum += i;
29            }
30            return sum;
31        } else {
32            // 任务太大,拆分为两个小任务
33            long mid = (start + end) / 2;
34            MyTask left = new MyTask(start, mid);
35            MyTask right = new MyTask(mid + 1, end);
36
37            // fork 子任务(异步执行)
38            left.fork();
39            right.fork();
40
41            // join 合并结果(等待子任务完成并返回)
42            return left.join() + right.join();
43        }
44    }
45}
46

运行流程

  1. MyTask(1,1000) 太大 → 拆分成 MyTask(1,500)MyTask(501,1000)
  2. 再继续拆,直到区间长度 ≤ 100 时,直接计算
  3. 最后通过 join() 把结果逐级汇总

Fork/Join 特点

1. 分治思想:

递归拆分任务 → 小任务直接执行 → 结果汇总。

2. 工作窃取:

如果某个线程执行完了,会去偷其他线程队列里的任务,提升 CPU 利用率。

a. 基本原理
  • 每个工作线程ForkJoinWorkerThread)都有一个 双端队列(Deque) 来存放任务。
  • 当线程自己提交任务时,会把任务放在 双端队列的队头
  • 线程会优先从自己队列的 队尾 获取任务执行(LIFO,减少缓存未命中,提高局部性)。
  • 如果线程自己的任务执行完了(队列空了),它就会 “窃取”其他线程队列头部的任务 来执行。
b. 为什么要用双端队列?
  • 本地线程取任务:从队尾取(后进先出,减少任务拆分深度)。
  • 其他线程窃取任务:从队头取(先进先出,避免和本地线程竞争)。

3. 适合 CPU 密集型任务

比如大数据计算、数组求和、递归处理。

Fork/Join 框架 = 多线程版的递归分治,背后依赖 ForkJoinPool工作窃取算法 来保证高效执行。


什么是Fork/Join?》 是转载文章,点击查看原文


相关推荐


《探索C语言中数组的奥秘(下)》
小龙报2025/10/2

《探索C语言中数组的奥秘(下)》 前言 学习了二维数组,我们已经基本了解了C语言中数组的使用方式,接下来就让我们进入二维数组的学习吧! 一、二维数组的创建 1.1⼆维数组的概念 ⼀维数组的数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元素这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。 1.2二维数组的创建 语法规则: type arr_name[常量值1][常量值2]; 例如: int arr[3][5]; double data[


【展厅多媒体】解析VR虚拟驾驶实现多场景自由切换
bmcyzs2025/10/2

VR虚拟驾驶技术的场景切换能力,彻底打破了物理展厅的空间局限,为体验者带来前所未有的自由探索感。系统内置丰富的数字场景资源库,涵盖多种精心设计的驾驶情境——从晨光映照的海岸公路,到霓虹流转的未来都市,用户只需通过直观的选单界面,便能轻松切换不同驾驶世界。 为实现流畅自然的体验过渡,模拟驾驶平台着重优化场景加载效率,通过预加载与渲染技术,极大缩短场景切换等待时间,保障体验过程的连贯性与沉浸感。在汽车展厅中,这项功能被灵活运用于展示车辆性能:切换到山地模式可突显SUV的爬坡能力,选用雨天场景则能清晰


AI 赋能 EMS 微电网能效管理平台:构建分布式能源的智能调控中枢
DDC楼宇自控与IBMS集成系统解读10/2/2025

微电网作为分布式能源(光伏、风电、储能)与负荷的局部能源网络,是实现 “双碳” 目标、提升能源利用效率的关键载体。传统能源管理系统(EMS)虽能完成微电网内数据采集、简单调度与监控,但面对微电网 “新能源出力波动大(如光伏受光照影响)、负荷需求动态变化(如工业用电峰谷差)、多能源协同复杂(如光 - 储 - 充联动)” 等特性,逐渐暴露出调度精度低、能效优化不足、故障响应滞后等短板。随着人工智能(AI)技术的深度融入,EMS 微电网能效管理平台正从 “被动监控” 向 “主动预测、智能优化、协同调度” 升级,形


软件工程作业-报告1
朝圣之路10/1/2025

本次作业要求每位同学独立选择并深度阅读一篇近年发表于人工智能领域的顶尖英文学术论文,并撰写一份分析报告。文献研读能力:培养独立检索、阅读并理解前沿英文技术文献的能力。问题拆解能力:从复杂研究中精准提炼其核心动机、待解问题、关键创新与技术路径。批判性思维:评估技术方案有效性,分析实验设计合理性,识别潜在局限与改进方向。技术表达能力:用清晰、结构化的书面语言准确阐述复杂技术思想与研究成果。


Zookeeper 技术详细介绍
new_daimond9/30/2025

Zookeeper是一个开源的分布式协调服务,为分布式应用提供一致性服务。其核心特性包括数据一致性保证和树形结构的数据模型,支持持久节点、临时节点等多种节点类型。主要应用场景涵盖配置管理、服务注册发现、分布式锁和集群管理等。关键实现基于ZAB协议确保数据一致性,并采用Leader-Follower架构。重难点涉及脑裂问题、性能优化和故障处理。部署方式支持单机、集群和Docker,同时提供监控运维能力。Zookeeper在分布式系统中发挥着重要的协调作用,是构建可靠分布式系统的核心组件。


Python 的内置函数 all
IMPYLH2025/10/4

Python 内建函数列表 > Python 的内置函数 all all() 是 Python 提供的一个高效工具,它可以快速判断可迭代对象中的所有元素是否都为真值(Truthy)。它的使用非常简单,但结合不同的场景,可以写出非常优雅的代码。 all 的函数原型如下: def all(iterable): ''' 判断可迭代对象内容是否全部为真值 :param iterable: 一个可迭代对象 :return: 如果 iterable 的所有元素均为真值


HBase的自动负载均衡,提升大数据存储性能
AI量化价值投资入门到精通2025/10/6

HBase自动负载均衡:让大数据存储像排队买奶茶一样高效 关键词 HBase、自动负载均衡、Region分布、大数据存储、性能优化、RegionServer、Master 摘要 在大数据存储领域,HBase凭借高可靠性、强一致性和可线性扩展的特性,成为电商订单、用户行为日志、物联网传感器数据等场景的首选。但随着数据量爆炸式增长,一个隐形的“性能杀手”会逐渐浮现——Region分布不均:有的RegionServer(数据节点)扛着100个Region(数据分片)忙得“喘不过气”,有的却只拿


【Ubuntu 20.04升级python3.9后终端打不开的bug】
woshihonghonga2025/10/7

3. 把Python3.9改为Python3首选项     sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1     sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2     sudo update-alternatives --config python3     


程序员副业 | 2025年9月复盘
嘟嘟MD2025/10/9

本文首发于公众号:嘟爷创业日记 。 我已经坚持日更600天+,欢迎过来追剧~ 大家好,我是嘟嘟MD,一个10年程序员,现在离职创业,有700天了,我每个月都会写一篇总结复盘,让大家可以近距离看看一个离职程序员都在干什么,今天这篇是九月份的总结,大概2000字,略长,有空的可以翻翻,希望对大家有一丢丢的借鉴作用! 一、月度大事 大家好,九月结束了,忙碌的一个月又结束了,这个月有些事情变化挺大,需要做出取舍。 1:公众号运营+B站视频运营 公众号和B站视频运营还是我的最高优先级,算是我的主业


微硕WSD2018DN22 N沟MOSFET,汽车副驾桌板LED照明负载开关
MOS管-冠华伟业2025/10/10

随着“办公座舱”概念升温,副驾折叠桌板需集成5V/9V USB、LED照明、触控按键等模块,空间被压缩至“毫米级”,却必须满足“零继电器噪音+零待机功耗+1mm高度”三重要求。微硕WINSOK推出DFN2×2-6S N沟MOSFET WSD2018DN22,凭10mΩ低导通电阻与12A峰值电流,为12V平台桌板LED照明提供“芯片级”静音负载开关方案,一键实现“无感”点亮与μA级待机。 一、市场趋势催生器件需求 2025年中国副驾桌板渗透率预计达28%,单车灯节点由1路增至4路,核心痛点:

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0