Java并发之ForkJoin

Java并发ForkJoin 文章目录一.简介二.Fork/Join2.1 分治任务模型2.2 API2.3 ForkJoinPool 工作原理三.示例 一.简介 并发编程可以分为三个层面的问题,分别是分工、协作和互斥,用类比现实世界的一些情况去理解并发任务,可以把线程池、Future、CompletableFuture 和 CompletionService 都列到了分工里面。 还有一种“分治”的任务模型,指的是把一个复杂的问题分解成多个相似的子问题,然后再把子问题分解成更小的子问题,直到子问题简单到可以直接求解。 分治思想在很多领域 阅读详情

ForkJoin简介

Java7中新添加了一种并发框架ForkJoin.如其名所言,ForkJoin框架适用于将任务分解为子任务,然后将结果合并的场景.

ForkJoin与Executor类似,使用池(ForkJoinPool)来管理线程(ForkJoinWorkerThread),使用队列来管理任务(ForkJoinTask).
不同的是,ForkJoin中使用多个队列来管理任务,并且分为共享队列(偶数)和工作队列(奇数).

共享队列只是用来存储提交的任务.
工作队列会与一个工作者线程ForkJoinWorkerThread绑定.
在工作队列为空时,工作者线程会从其他任务队列(包含共享和工作队列)窃取一个任务来执行.
工作者线程执行并分解任务,其分解的任务,会提交到其对应的工作队列.

ForkJoin工作流程

ForkJoinPool工作流程

ForkJoinPool工作流程如下图:
ForkJoinPool工作流程

步骤说明如下:

1.任务task0被提交到ForkJoinPool池

2.ForkJoinPool池将任务放入共享队列(偶数队列)

3.检查并发等级(活动工作线程数),ForkJoinPool池添加工作队列和工作者线程

4.工作者线程遍历ForkJoinPool池中的任务队列,取出一个任务.

5.工作者线程发现共享队列除了取出的任务外,还有其他任务,通知ForkJoinPool池创建新工作者;然后执行任务(任务执行中可能产生新任务,新任务提交到此线程对应的工作队列);执行任务达到一定数量或工作者队列为空时,尝试等待或退出,不满足条件重复4,5步骤;满足等待,则停止工作,等待唤醒,唤醒后重复4,5步骤;满足退出条件,则退出.

6.ForkJoinPool池根据并发等级等条件创建新工作队列和工作者线程

7.新工作者线程遍历ForkJoinPool池中的队列,取出一个任务;重复步骤5的操作.

线程工作窃取流程

任务在等待子任务完成,即执行subTask.join()时,进行工作窃取.流程如图:
线程工作窃取流程

1.w工作者,在等待currentJoin任务的完成;

2.它遍历工作者队列,发现v工作者在执行此任务(即v.currentSteal == w.currentJoin), 并且v队列的数组中还有其他任务,w则帮助v执行任务,如果w帮助v将队列数组中的任务执行完了,而w等待的currentJoin还没有完成,则w检查v是否在等待其他任务;

3.如果在等待(即v.currentJoin != null),则找到对应执行任务的j(即j.currentSteal == v.currentJoin);不在等待,或没有对应的j,进入步骤5

4.如果j队列的数组中还有其他任务,w则帮助j执行任务;如果没有任务,且j的任务没有执行完成,则检查j是否在等待其他任务,如果有,反复类似3,4操作;

5.否则,w请求睡眠补偿(即w通知池它将睡眠,池启动另一个工作者替代).如果成功,则w睡眠;否则继续遍历工作者队列(如前面ForkJoinPool工作流程中4)

工作者线程睡眠唤醒

工作者线程的睡眠唤醒是通过ForkJoinPool的成员域ctl控制的.
如下图:
工作者线程睡眠唤醒

如前所述,工作者线程是绑定到一个工作队列的.

工作者线程在睡眠前,会将其对应工作队列的scanState写入ctl的低32位.而原ctl中的低32的值会写到工作队列的stackPred中.这样就形成了一个链表.ctl低32位对应最后睡眠的工作者线程t0的工作队列wt0的scanState;而工作队列wt0的stackPred对应在其之前睡眠的工作者线程t1(如果存在)的工作队列wt1的 scanState;依次类推,即可遍历出所有线程睡眠的反序列. 而线程唤醒顺序即为这个反序列.

其他

为了提高性能,在一些小细节上有一些特别的优化.

如,为了判断是否要新建线程,即活动运行工作者数量是否达到了目标并发数,它不是保存活动运行工作者数量,而是保存活动运行工作者数减去目标并发(AC)的数值,这样每次判断时不用再进行减法操作.

还有,它在一些地方使用了延时锁.这样即保证了数据的同步,又减小了同步开销.

【Java 并发编程】ForkJoin 框架使用代码实例 在文章 JUC并行计算框架 Fork/Join 原理图文详解&代码示例 中,我们详细介绍了 ForkJoin 框架 的原理,这里我们再给出一个代码实例: package i.juc; import java.util.Arrays; import java.util.List; /** * @author: Jack * 2020-06-03 10:20 */ public cl... 阅读详情

相关推荐

dmx512协议c语言编程,DMX512协议+c程序代码.pdf

DMX512 协议1.协议简介DMX 是Digital MultipleX 的缩写 ,意为多路数字传输。DMX512 控制协议是美国舞台灯光协会(USITT)于1990 年发布的灯光控制器与灯具设备进行数据传输的工业标准 ,全称是 USITT DMX512(1990) ,包括电气特性、数据协议、数据格式等方面的内容。2. 电气特性和物理层2.1. 电气特...

weixin_39928993的博客 2545

15、ForkJoinPool之基础篇

一、基础 1.1 原理 1.1.1 ForkJoinPool工作队列原理 在分析ForkJoinPool之前,我们先来说说它的实现原理 下面是ForkJoinPool工作队列组的示意图 重点说明: 工作队列组的容量为2次幂的值,索引为偶数的,用于存放外部线程提交过来的任务,索引下标为奇数的,存放的是ForkJoinPool内部创建的线程fork出来的任务,工作队列组是一个数组,其元素的类型为...

zhen_hong的博客 984

【基于大模型 + FAISS 的本地知识库与智能 PPT 生成系统:从架构到实现】

本文介绍了一个基于大模型(Ollama+DeepSeek)和FAISS向量数据库的本地知识库与智能PPT生成系统。该系统采用前后端分离架构,包含文档管理、向量检索、PPT生成等核心模块,可实现文档智能解析、语义检索和结构化PPT自动生成。通过MVC设计模式,系统实现了从文档上传、向量存储到内容检索、PPT生成的全流程自动化,有效解决了企业知识管理效率低下的问题。架构设计清晰,功能模块完备,为企业和个人提供了高效的文档处理与二次创作解决方案。

聚焦大数据、AI、数据库三大核心领域,分享 Flink/Spark 实时计算、数仓架构设计、AI 模型落地、数据库性能调优的实战干货,附可直接运行的源码与方案。提供企业技术内训、项目咨询与定制化服务,助力开发者与企业高效搞定数智技术难题。 1600

ForkJoinPool使用以及原理解读,深入剖析原理

题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。【Android思维脑图(技能树)】

m0_56169789的博客 2496

瑞芯微RK3506开发板DSM音频开发避坑指南:从硬件改接到内核配置全流程

本文详细解析了在瑞芯微RK3506开发板上进行DSM音频开发的完整流程与关键避坑点。内容涵盖从硬件改造(如电阻焊接)、内核驱动配置(DTS参数、补丁应用)到系统调试与波形分析的全过程,旨在帮助嵌入式开发者高效实现高信噪比、低成本的音频方案,避免常见错误。

weixin_29164091的博客 410

Zabbix Trigger actions访问出现500

本篇博客详细介绍了Zabbix访问'Trigger actions'出现的错误状况,访问界面出现500,并提供了解决方案。

格子的博客 564

Java ForkJoin 简介和应用

Java 并行计算框架 Fork Join 简介和应用 基于分治思想分解任务并处理,工作窃取算法充分利用线程资源

weixin_42176639的博客 2638

方差分析ANOVA、T检验、卡方检验的区别

T检验和ANOVA都是用来看样本之间均值是否相等,但是两者又有什么区别呢? 卡方检验是用来看分类变量之间有没有相关性。 自变量X类型 自变量X组数 因变量Y类型 分析方法 离散(类别) 仅仅2组 连续(均值) t检验 离散(类别) 2组及以上 连续(均值) ANOVA 离散(类别) 2组及以上 离散(类别) 卡方检验 进一步细分 方差分析 从理论上讲,方差分析有两个前提条件,一是因变量Y需要满足正态性要求,二是满足方差齐检验。 方差不齐时可使用‘非参数检验’,同时还可使用wel

itslifeng的博客 4万+

Java并发编程——ForkJoin详解

概念 Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。类似于Java 8中的parallel Stream。 【只能将任务1个切分为两个,不能切分为3个或其他数量】 简单使用 public class ForkJoinExample { //针对一个数字,做计算。 private static final Integer MAX = 200; static class

Java是世界上最好的语言 1万+

【Unity】Gif图片播放插件(支持UI及模型纹理渲染两种模式)

unity本身不支持GIF格式文件直接渲染, 因此一般的做法是通过加载图片,通过代码控制其循环播放、停止等,模拟动画效果,本文简单介绍一下某个现有开源工具,感谢开源作者。

灵境引路人 4036

无人机——电机篇(一)

1. 电机的定义 电机俗称“马达”,是无人机的动力来源,无人机通过改变电机的转速来改变无人机的飞行状态。即改变每个电机的速度,使得无人机能够盘旋空中,上升或下降,或向各个方向移动。2. 电机的分类 电机分为:“无刷电机”和“有刷电机” - 无刷电机:是采用半导体开关器件来实现电子换向,具有可靠性高、低干扰、低噪声低、寿命长等优点。一般应用在稍大型的飞行器,载重大,可以有更广泛的用途。 - 有刷电机:是内含电刷装置的将电能转换成机械能(电动机)或将机械能转换成电能(发电机)的旋转电机。有刷电机是所有电机的基

weixin_46066938的博客 1万+

秒懂 Java Fork-Join

fork/join 框架是 Java 7 中引入的 ,它是一个工具,通过 「 分而治之 」 的方法尝试将所有可用的处理器内核使用起来帮助加速并行处理。在实际使用过程中,这种 「 分而治之 」的方法意味着框架首先要 fork ,递归地将任务分解为较小的独立子任务,直到它们足够简单以便异步执行。然后,join 部分开始工作,将所有子任务的结果递归地连接成单个结果,或者在返回 void 的任务的情况下,程序只是等待每个子任务执行完毕。

二师兄撒欢之地 1174

【Arduino 动手做】六舵机自平衡 Rotary Stewart 平台

《Arduino六舵机自平衡Rotary Stewart平台项目》 该项目展示了一个基于Arduino的六自由度Rotary Stewart平台,通过六个舵机实现动态平衡控制。设计采用激光切割框架和TAMIYA 70171套件,提供详细组装指南和开源固件(GitHub可获取)。开发者丹·罗耶分享了3D打印文件、视频演示及运动学优化需求,强调该平台可扩展应用于游戏控制(如Kerbal Space Program)或教育领域。项目链接包含完整资源包,鼓励用户参与改进并分享创作成果。该案例体现了Arduino在机

雕爷学编程 1094

Java并发10 - ForkJoin并发框架

Java并发10 - ForkJoin并发框架

qq_43350524的博客 1383

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java并发编程 - 分支合并ForkJoin

ForkJoin框架提供了一种优雅的方式来处理并行任务,尤其是那些可以自然地分解为子任务的问题。通过使用和,可以很容易地实现并行计算,并充分利用多核处理器的优势。在设计并行算法时,ForkJoin框架是一个非常有用的工具。

qq_33240556的博客 1102

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java多线程——ForkJoin并发框架

本章主要对ForkJoin并发框架进行学习,主要内容分为三个部分: ForkJoin并发框架的浅谈 ForkJoin并发编程的两个实例 ForkJoinPool线程池的常用方法说明 1.ForkJoin并发框架的浅谈 1.1.Fork和Join ForkJoin并发框架:Fork=分解 + Join=合并 ForkJoin并发框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务...

Zzhou1990的博客 1408

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java 并发的四种风味:Thread、Executor、ForkJoin 和 Actor...

Java 并发的四种风味:Thread、Executor、ForkJoin 和 Actor...

weixin_45101742的博客 840

Java并发工具类---ForkJoin、countDownlatch、CyclicBarrier、Semaphore

fork join是JDK7引入的一种并发框架,采用分而治之的思想来处理并发任务ForkJoin框架底层实现了,当一个线程完成任务处于空闲状态时,会窃取其他工作线程的任务来做,这样可以充分利用线程来进行并行计算,减少线程竞争。但是在某些情况下也会存在竞争。1.拆分任务中不应该去执行IO操作2.任务不能检查抛出异常,必须通过必要的代码来抛出异常。这个在源码中就可以体现,很多地方都是通过代码主动抛出异常。

qq_56892136的博客 1183

深入解析Java并发编程核心:ForkJoin工作窃取算法与双端队列实现

在当今计算密集型应用日益普及的背景下,Java并发编程已成为开发者必须掌握的核心技能。多核处理器的普及使得传统单线程程序无法充分利用硬件资源,而并发编程通过将任务分解为可并行执行的单元,显著提升了系统吞吐量和响应速度。Java从早期版本就提供了丰富的并发编程工具,包括Thread类、synchronized关键字以及java.util.concurrent包中的高级并发组件,这些工具共同构成了Java强大的并发生态系统。

zuiyuelong的博客 915

JAVA并发编程梳理与学习三(ForkJoin)

一、ForkJoin说明 ForkJoin是jdk1.7增加的并发工具类,可以解决分而治之的问题,就是把一个任务分为若干小任务,并发的去处理,最后再把处理结果合并起来,从而达到提高速度的目的。使用时要保证每个小任务互不干扰、相互独立且结构和主任务相同,用递归的方法解决这些小任务,最终合并到一起 二、ForkJoin使用 1.首先创建ForkJoinPool,ForkJoinPool可以理解为一个线程池,里面维护的线程数一般为cpu核数,不断的执行拆分的任务,并且还会工作窃取,就是自己的活要是干完了空闲了,

m0_37611440的博客 247

Java并发的四种风味:Thread、Executor、ForkJoin和Actor

Java并发的四种风味:Thread、Executor、ForkJoin和Actor ForkJoin工具类与实现demo 1.工具类 package thread.demo_027; import java.util.concurrent.RecursiveTask; public class ForkJoinWork extends RecursiveTask<Long&gt...

点点的博客 568

【Java并发编程】13、forkjoin

http://www.infoq.com/cn/articles/fork-join-introduction http://www.importnew.com/14506.html Java7中的ForkJoin并发框架初探(下)—— ForkJoin的应用 http://www.molotang.com/articles/706.html 转载于:https://www.cn...

weixin_30809333的博客 76

Java并发的四种口味:Thread、Executor、ForkJoin、Actor

这篇文章讨论了Java(Scala)应用中的并行处理的多种方法。从简单的自己管理Java线程,到各种提供的已实现的解决方案:Executor(Java)、ForkJoin(Java 7)、Actor(Akka)。

Freecloud 1345
上一篇: 内存栅栏:软件高手的硬件观(四)
下一篇: AndroidManifest官方文档
ProgramResearch
博客等级 码龄11年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值