跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 并发编程:ForkJoin 分而治之框架

ForkJoin 框架是 Java7 提供的并行任务处理工具,采用分而治之策略将大任务拆解为小任务并行执行。核心组件包括 ForkJoinTask(含 RecursiveTask 和 RecursiveAction)与 ForkJoinPool。ForkJoinPool 利用工作窃取算法优化线程利用率,适用于计算密集型场景。

t ag发布于 2020/6/17更新于 2026/7/835 浏览
Java 并发编程:ForkJoin 分而治之框架

什么是 ForkJoin

ForkJoin 框架是 Java7 提供的用于并行执行任务的框架,它将大任务分割成若干小任务,最终汇总每个小任务结果后得到大任务结果。

通过 Fork 和 Join 两个单词理解该框架:Fork 指把大任务切分为若干子任务并行执行,Join 指合并这些子任务的执行结果。例如计算 1+2+...+10000,可以分割成 10 个子任务,每个子任务分别对 1000 个数进行求和,最终汇总这 10 个子任务的结果。

使用步骤

第一步分割任务。首先创建一个 Fork 类来把大任务分割成子任务,如果子任务仍然很大,则继续递归分割,直到子任务足够小。

第二步执行任务并合并结果。分割的子任务分别放在双端队列里,多个线程分别从双端队列获取任务执行。子任务执行完的结果统一收集,启动一个线程从队列拿数据并合并。

Fork/Join 使用两个核心类完成以上操作:

ForkJoinTask 使用 ForkJoin 框架必须创建 ForkJoin 任务。它提供在任务中执行 fork() 和 join() 操作的机制。通常不需要直接继承 ForkJoinTask 类,而是继承其子类:

  • RecursiveAction:用于没有返回结果的任务。
  • RecursiveTask:用于有返回结果的任务。

ForkJoinPool ForkJoinTask 需要通过 ForkJoinPool 来执行。任务分割出的子任务会添加到当前工作线程维护的双端队列头部。当一个工作线程的队列为空时,它会随机从其他工作线程的队列尾部获取一个任务。

ForkJoinPool 池与工作窃取 ForkJoinPool 是一个存放任务的池子。它与 ExecutorService 的区别主要在于使用了'工作窃取'算法:一个大任务被划分成无数个小任务分配到不同队列,干活快的线程在完成自己队列的任务后,会从隔壁队列(通常是尾部)拿去任务执行,从而平衡负载。

测试代码

以下示例演示 RecursiveTask 实现求和逻辑。

package com.example.concurrent;

import java.util.concurrent.RecursiveTask;

public class ForkJoinUtil extends RecursiveTask<Integer> {
    private final static int threshold = 3;
    private final int start;
    private final int end;

    public ForkJoinUtil(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if (end - start <= threshold) {
            int sum = 0;
            for (int i = start; i <= end; i++) {
                sum += i;
            }
            return sum;
        } else {
            int middle = (start + end) / 2;
            ForkJoinUtil left = new ForkJoinUtil(start, middle);
            ForkJoinUtil right = new ForkJoinUtil(middle + 1, end);
            left.fork();
            int rightResult = right.compute();
            int leftResult = left.join();
            return leftResult + rightResult;
        }
    }
}

目录

  1. 什么是 ForkJoin
  2. 使用步骤
  3. 测试代码
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 算法基础:一维前缀和与最大子段和实战
  • 飞算 JavaAI 专业版实测:全栈代码生成与开发效率提升
  • Linux Ext2 文件系统深度解析
  • 2025 年人工智能发展趋势与学习路径指南
  • C++ 链接错误 undefined reference 原因分析与解决方案
  • C++ 基于正倒排索引的 Boost 搜索引擎:日志宏与 Server 主程序详解
  • 大模型幻觉纠正与知识蒸馏新进展:HalluEditBench 与 SIKeD 研究解读
  • Linux 多线程核心:资源划分与控制实战指南
  • OpenClaw 配置飞书机器人完整指南
  • Windows 环境下 Git 安装与配置指南
  • PyWebIO 实现精准弹窗交互的关键点
  • 数据结构初阶:二叉树的链式存储结构详解
  • Java Map 常用方法与实现类深度详解
  • Java 动态代理核心原理与实战对比
  • C++ 类与对象:面向对象编程入门
  • GitHub Copilot 代理配置与网络优化实战指南
  • Android 开发中 OOM 问题的常见原因与解决方案
  • 从多库并存到一库多能:金仓数据库融合架构实践
  • 利用统一 API 接口实现大模型选型与成本优化
  • 分布式文件系统 HDFS 存储原理详解

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online