当前位置:网站首页>Fork/Join框架
Fork/Join框架
2022-08-04 17:09:00 【51CTO】
在JDK7时,出现了一个新的框架用于并行执行任务,它的目的是为了把大型任务拆分为多个小任务,最后汇总多个小任务的结果,得到整大任务的结果,并且这些小任务都是同时在进行,大大提高运算效率。Fork就是拆分,Join就是合并。
我们来演示一下实际的情况,比如一个算式:18x7+36x8+9x77+8x53,可以拆分为四个小任务:18x7、36x8、9x77、8x53,最后我们只需要将这四个任务的结果加起来,就是我们原本算式的结果了,有点归并排序的味道。

它不仅仅只是拆分任务并使用多线程,而且还可以利用工作窃取算法,提高线程的利用
- 工作窃取算法:是指某个线程从其他队列里窃取任务来执行。一个大任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和一对应。但是有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务待处理。干完活的线程与其等着,不如帮其他线程干活,于是它就去其他线程的队列里窃取一个任务来执行。

Fork/Join使用两个类来完成以上两件事情:
ForkJoinTask
我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()
操作的机制,通常情况下我们不需要直接继承ForkJoinTask类,而只需要继承它的子类,Fork/Join框架提供了以下两个子类:
- RecursiveAction:用于没有返回结果的任务。
- RecursiveTask :用于有返回结果的任务。
- ForkJoinPool需要通过
ForkJoinPool来执行,任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务。
现在我们来看看如何使用它,这里以计算1-1000的和为例,我们可以将其拆分为8个小段的数相加,比如1-125、126-250... ,最后再汇总即可,它也是依靠线程池来实现的:

可以看到,结果非常正确,但是整个计算任务实际上是拆分为了8个子任务同时完成的,结合多线程,原本的单线程任务,在多线程的加持下速度成倍提升。
包括Arrays工具类提供的并行排序也是利用了ForkJoinPool来实现:
并行排序的性能在多核心CPU环境下,肯定是优于普通排序的,并且排序规模越大优势越显著。
边栏推荐
- Digital-intelligent supply chain management system for chemical manufacturing industry: build a smart supply system and empower enterprises to improve production efficiency
- 湖北移动HG680-LV_S905L3B_线刷固件包
- 水能自发变成“消毒水”,83岁斯坦福教授:揭示冬天容易得流感的部分原因...
- LeetCode Question of the Day - 1403. Minimum Subsequence in Non-Increasing Order
- mysql学习笔记——利用动态SQL和Session变量实现一个公式或者计算器
- 拼多多详情API接口深度解读
- taro 滚动组件ScrollView
- 通关剑指 Offer——剑指 Offer II 010. 和为 k 的子数组
- 九联_UNT400G_S905L2_(联通)_线刷固件包
- JSP的Web监听器(Listener)
猜你喜欢

华硕win11安全启动如何开启

湖北电信天邑TY1608_S905L3B_MT7668_卡刷固件包

】 【 LeetCode daily one problem - 540. The order of a single element of the array

Unity Apple登录接入

泰坦尼克号沉船数据之美——起于悲剧,止于浪漫

Mobile zte ZXV10 B860AV2. 1 - A_S905L2_MT7668_ wire brush the firmware package

RTL8762DK 远端设备配对

通关剑指 Offer——剑指 Offer II 010. 和为 k 的子数组

不需要服务器,教你仅用30行代码搞定实时健康码识别

餐饮供应链管理系统
随机推荐
Unity Apple登录接入
全世界国家和地区国家顶级域名对照表
学习探索-网站中引入百度统计
容器化 | 在 NFS 备份恢复 RadonDB MySQL 集群数据
消灭异步回调,还得是async-await
Mobile Hisense IP102H_905L3-B_wire brush firmware package
ES中同时使用should和must导致只有must生效解决方案
R语言使用yardstick包的gain_curve函数评估多分类(Multiclass)模型的性能、查看模型在多分类每个分类上的增益(gain)曲线(gain curve)
taro 滚动组件ScrollView
最小区间覆盖
xgboost模块param中的一些错误
全球电子产品需求萎靡:三星越南工厂大幅压缩产能,减少工人工作日
SAP 电商云 Spartacus UI 页面布局的设计原理
适配器模式
Boost library study notes (1) Installation and configuration
机器学习(十九):梯度提升回归(GBR)
浅谈运用低代码技术如何实现物流企业的降本增效
设置表头颜色
WEB 渗透之XXE&XML
】 【 LeetCode daily one problem - 540. The order of a single element of the array