摘要:ForkJoin线程池是将任务分割为子任务,有可能子任务还是很大,还需要进一步拆解,最终得到足够小的任务。

本文分享自华为云社区《ForkJoin线程池的学习和思考》,作者:breakDraw。

ForkJoin线程池在常规的java书籍里还是提到比较少的,毕竟是java8引入的产物。

首先这里简单解释一下forkJoin的运作原理, 本质上有点像归并计算。

  1. 他会将提交大任务按照一定规则拆解(fork)成多个小任务
  2. 当任务小到一定程度时,就会执行计算
  3. 执行完成时会和其他的小任务进行合并(join), 逐步将所有小结果合成一个大结果。

可以看这个forkJoinTask的实现伪代码,即如果想使用forkJoin并发执行任务,需要自己把任务继承RecursiveTask,作为forkJoin池的submit对象:

public class ForkJoinTask extends RecursiveTask<任务参数> {public ReckonTask(任务参数) {} @Overrideprotected File compute() {if(根据任务参数判断任务是否足够小) {计算,返回} else {拆分成子任务1和子任务2 任务1.fork();任务2.fork();结果1 = 任务1.join();结果2 = 任务2.join();返回结果1+结果2;}}
}

然后实际上整个forkjoin的细节非常多,这里我通过给自己提好几个问题,来逐步理解forkJoin的原理:

Q: forkJoin中各个线程是如何获取那些小任务的呢?
A:他是通过工作密取的方式获取。(java并发那本书里提到过工作密取workSteal,原来是用在这了)

  • 假设我们给forkJoin设置3个工作线程,那么就会有3个工作队列, 注意,这个队列是双端队列。
  • 每当执行任务时,如果不满足小任务的条件,他会fork出2个子任务,并push进自己的工作队列中。
  • 每个工作线程不断取自己队头的任务执行。
  • 关键点:如果自己队列里没有数据,则会从其他队列的队尾取数据。

Q: fork时具体发生了什么?
A:是一个异步的操作, 就是向当前线程队列中添加这个fork出来任务,能放进去的话就返回,不会等待。
注意,默认fork出的任务是先默认给自己的。 当自己做不完时,才可能被别人取走!

Q: join是什么含义?什么时候做的?
A:见实现forkJoin任务接口时的代码:

可以看到时每次fork完之后, 通过join,来获取子task的结果,获取到之后,再合并计算,返回结果。

Q: join这个阻塞过程是怎么做的?如果把线程挂起,那这个线程岂不是无法工作了?
A:首先,之前fork时,新的子任务已经被放入队列了。
每个子任务都有一个任务状态。
当调用该子任务的join时, 会循环判断他的状态

如果这个子任务状态未完成, 则从自身队列或其他人的队列中取出新的任务执行,因此进入了下一层的exec()操作。

如果发现子任务状态更新为了完成(这个更新动作可能是自己线程完成的,也可能是别的线程完成的,反正这个任务的状态实现了同步和可见), 则将结果返回给上层。

因此join的本质是一个递归的过程, 任务没完成的话,他就取其他任务继续递归往下执行。

更详细的可以看这个链接fork+join过程详细解读

Q: forkJoin存放任务的时候,怎么保证不会出现并发问题?比如同时往队尾插入的话
A:

  • n个工作线程是通过数组存放的(即有一个工作线程数组)
  • sun.misc.Unsafe操作类直接基于操作系统控制层在硬件层面上进行原子操作,它是ForkJoinPool高效性能的一大保证,类似的编程思路还体现在java.util.concurrent包中相当规模的类功能实现中。

Q: forkJoin应用在哪吗?
A:java8 stream的parallel并发功能就是基于forkJoin做的, parallelStream实现的forkJoin拆解任务和执行任务的接口, 默认用机器所有CPU数量的forkJoin线程池。
如果需要限制线程数量,可以用
new forkJoin(线程数).submit(()->(list.stream().parallel().map()…)); 即可

点击关注,第一时间了解华为云新鲜技术~

六问六答理解ForkJoin原理相关推荐

  1. 划重点!GDPR,阿里云的六问六答

    5月25日,欧盟通用数据保护条例要求(GDPR)正式生效.对每一家企业来说,GDPR是一次非常严格的考核,促使企业从管理.技术.运营等多个方面,对隐私保护水位线做一次全面复盘,加以改善. GDPR生效 ...

  2. 在 Windows 内核上运行 Docker 靠谱吗?专家六问六答帮你解惑!

    本文首发自"Docker公司"公众号(ID:docker-cn) 编译丨小东 每周一.三.五 与您不见不散! 上周三,我们为大家带来了新一期的网络研讨会--不改代码!看 Dock ...

  3. 《MySQL——主备一致性六问六答》

    目录 备库为什么要设置为只读模式? 备库设置为只读,如何与主库保持同步更新? A到B的内部流程如何? binlog内容是什么? `row`格式对于恢复数据有何好处 M-M结构的循环复制问题以及解决方案 ...

  4. [chatGPT]六问ChatGPT:当AI“成精”

    如今的ChatGPT,火到几乎什么话题想蹭上它的热度,然而这世上很多事物都是来得快去得快,半年后ChatGPT还能这样收到人们热议吗?对于ChatGPT,我们有太多疑问.本文作者提出了关于ChatGP ...

  5. 六问射频脉冲频谱测试

    射频脉冲信号广泛应用于脉冲体制雷达中,对于从事相关领域的工程师而言,总是绕不开脉冲信号的测试.就射频脉冲信号而言,需要测试的参数比较多,诸如脉宽.周期等时间参数,峰值功率.平均功率等幅度参数,再复杂一 ...

  6. 大白话 六问数据中台!你想知道的都在这了!

    数据中台.相信这四个字大家一定不陌生.因为在2019年.数据中台可谓是最火的概念之一,很多大公司都在布局自己的数据中台. 那么数据中台到底是什么?它和我们熟知的数据平台有啥区别?它为什么会这么火.能给 ...

  7. 操作系统不等于 Linux,六问操作系统新时代!

    整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 「路漫漫其修远兮,吾将上下而求索.」操作系统这条路没有捷径可言,这在 PC.移动互联网时代便是如此,在当下随着自动驾驶.工业互联网等智能场 ...

  8. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

  9. 六问禅道4:产品和项目的区别

    传送门 六问禅道1:为什么任务里剩余工时不自动更新 六问禅道2:为什么别人能看到我的任务 六问禅道3:我的燃尽图怎么没更新 今天我们来聊聊产品和项目的区别. 不少刚接触禅道的童鞋都会这个问题:产品和项 ...

最新文章

  1. java复合设计模式,Java – 复合设计模式和空覆盖
  2. MYSQL创建多张表,相同表结构,不同表名
  3. 数据结构与算法---笔记
  4. Visual Studio Online 东半球首秀,亮相 .NET Conf 2019 中国峰会
  5. c++ stack 遍历_划重点啦!带你解读图的两种遍历方式
  6. Xcode - Plugins And Themes
  7. 蓝屏蓝屏代码查询器_蓝屏点播?
  8. 环境试验之模拟运输试验
  9. 用python 开发FreeCad 入门
  10. iOS 屏幕旋转 强制旋转
  11. 南大计算机软件所,2020考研南京大学计算机软件研究所推免夏令营通知_南大软件所20推免_聚创南大考研网...
  12. median _matlab 中值滤波函数
  13. fastadmin中ajax传参
  14. 串口服务器调试助手使用教程,串口服务器如何配置及串口调试6大技巧
  15. AcWing 1183电力(Tarjan求割点)
  16. epub编辑器apk_使用您喜欢HTML编辑器编辑ePub电子书
  17. 听精品教学展示课后感
  18. 混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
  19. android 发送短信sms
  20. 灰色关联度矩阵--基于Matlab

热门文章

  1. 十年 | 我花了十年,才弄明白了Node.js
  2. Bootstrap导航组件
  3. Bootstrap 表格的默认样式
  4. 使用anaconda切换Python环境使用spyder
  5. Git笔记(15) 远程分支
  6. java最大最小距离算法缺点_java算法(蓝桥杯)- 算法提高 题目1 最大最小值
  7. “啁啾”看完这篇再不懂,放弃吧……
  8. 项目周期一般多久_深圳app开发公司的软件开发要多久?
  9. ios客户端做屏蔽_Transmission 屏蔽迅雷反吸血脚本
  10. html的title设置,动态设置html的title