11.ForkJoinPool 分支/合并框架 (工作窃取)
/*ForkJoinPool 分支/合并框架 (工作窃取)*/
Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork) 成若干个小任务(拆到给出的临界值为止),再将一个个的小任务运算的结果 进行join汇总
Fork/Join 框架 与 线程池的区别
1.采用 “工作窃取” 模式 (work-stealing)
当执行新的任务时它可以将其拆分成 更小的任务执行,并将小任务加到线程队列中,当没有任务执行时,再从一个随机线程的队列中偷一个并把它放在自己的队列中
2.相对于一般的线程池实现 ,fork/join 框架的优势体现在对其中包含的任务的处理方式上,在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行
那么该线程会处于等待状态。而在fork/join 框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行。
那么处理该子问题的线程会主动寻找其他尚未运行的子问题(窃取过来)来执行,这种方式减少了线程的等待时间,提高了性能
- public class TestForkJoinPool {
- public static void main(String[] args) {
- ForkJoinPool pool = new ForkJoinPool();
- //计算 0L,100000000L 的总和,100000000 减去 0 大于 我们给定的临界值 10000,所以会进行拆分,
- //拆分成 0 50000000 ; 500000001 100000000 两部分, 50000000 减去 0 又大于我们的临界值,又会继续进行拆分,直到不大于我们给定的临界值,
- //这样的话,就拆分成了很多的小任务,每个线程都分配了一些小任务构成自己的任务队列,当有些线程执行完了自己的任务时,不会直接结束线程,
- //而是从其他线程的任务队列中 偷取一个任务 放到自己的任务队列中
- //如果有线程阻塞了,也不会因为这个线程的阻塞,导致为这个线程分配的任务被阻塞无法执行,其他线程执行完了,会来帮助他的
- ForkJoinTask<Long> task = new ForkJoinSumCalculate(0L,100000000L);
- long sum = pool.invoke(task);
- System.out.println(sum);
- }
- }
- class ForkJoinSumCalculate extends RecursiveTask<Long> {
- /**
- *
- */
- private static final long serialVersionUID = 6145975974734867182L;
- private long start;
- private long end;
- private static final long THURSHOLD = 10000L; //临界值
- public ForkJoinSumCalculate(long start,long end) {
- this.start = start;
- this.end = end;
- }
- @Override
- protected Long compute() {
- long length = end - start;
- if(length <= THURSHOLD) {
- long sum = 0L;
- for(long i = start;i <= end;i++) {
- sum+=i ;
- }
- return sum;
- } else {
- long middle = (start + end) / 2;
- //又会再一次执行 compute(),但是传入的 参数是拆分之后的
- ForkJoinSumCalculate left = new ForkJoinSumCalculate(start, middle );
- left.fork(); //进行拆分,同时压入线程队列
- //又会再一次执行 compute(),但是传入的 参数是拆分之后的
- ForkJoinSumCalculate right = new ForkJoinSumCalculate(middle + 1, end );
- right.fork(); //
- return left.join() + right.join(); //结果合并
- }
- }
- }
11.ForkJoinPool 分支/合并框架 (工作窃取)的更多相关文章
- java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取
Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总. Fork/Join 框架与线程池的 ...
- ForkJoinPool分支合并框架-工作窃取
Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成 若干个小任务(拆到不可再拆时), 再将一个个的小任务运算的结果进行 join 汇总 For ...
- ForkJoinPool 分支/合并框架
ForkJoinPool 分支/合并框架 一.Fork/Join框架简介 Fork/Join 框架就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小 ...
- ForkJoinPool分支/合并框架工程使用的工作窃取
ForkJoinPool分支/合并框架 在必要的情况下,讲一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆为止),再将一个个小的任务运算的结果进行join汇总. 工作窃取的背景 分支/合并框 ...
- TortoiseGit- 创建本地新分支,提交推送到远程,本地新分支合并到工作分支,提交到远程工作分支等。
整体思路: 创建本地新分支 (create branch) -- 切换到本地新分支工作 (switch/checkout) --提交修改 (commit) -- 推送到远程新分支 (push) ...
- JUC-分支合并框架
一.原理 Fork:把一个复杂任务进行分拆,大事化小 Join:把分拆任务的结果进行合并 ForkJoinPool 分支合并池 类比=> 线程池 ForkJoinTask ForkJo ...
- git的工作流程(分支合并)
git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: 去自己的工作分支$ git checkout work 工作.... 提交工作分支的修改$ ...
- Java并发包线程池之ForkJoinPool即ForkJoin框架(二)
前言 前面介绍了ForkJoinPool相关的两个类ForkJoinTask.ForkJoinWorkerThread,现在开始了解ForkJoinPool.ForkJoinPool也是实现了Exec ...
- Java并发包线程池之ForkJoinPool即ForkJoin框架(一)
前言 这是Java并发包提供的最后一个线程池实现,也是最复杂的一个线程池.针对这一部分的代码太复杂,由于目前理解有限,只做简单介绍.通常大家说的Fork/Join框架其实就是指由ForkJoinPoo ...
随机推荐
- 总结Lock和synchronized的区别
1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现. 2. Lock可以选择性的获取锁,如果一段时间获取不到, ...
- iOS 字符串和图片互转
for (UIImage *myImg in _imgArray) { NSData *imageData = UIImageJPEGRepresentation(myImg,0.5); NSStri ...
- [转]Postgres-XL 10r1英文文档
Postgres-XL 是一个完全满足ACID的.开源的.可方便进行水平扩展的.多租户安全的.基于PostgreSQL的数据库解决方案. Postgres-XL 可非常灵活的应用在各类场景中,比如: ...
- dubbo的负载均衡策略和容错策略
一.dubbo 负载均衡策略 random loadbalance 默认情况下,dubbo 是 random load balance 随机调用实现负载均衡,可以对 provider 不同实例设置不同 ...
- Mysql统计每年每个月的数据——详细教程
Mysql统计每年每个月的数据(前端页面统计图实现) 最终想实现的效果图,在这里就不多废话了,直接上效果图,由于测试数据有几个月是为0的,所以数据图看着会有点怪怪. 接下来是数据库的两个表,这里直接给 ...
- 最新 网易java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易.京东.去哪儿等10家互联网公司的校招Offer,因为某些自身原因最终选择了网易.6.7月主要是做系统复习.项目复盘.LeetCode与牛客刷题 ...
- 配置node低版本支持ES7
由于node的版本为6.*,不升级情况下,能使用ES7的 async await 特性, 在目录下 添加 start.js package.json里添加依赖配置 重新npm install 下载依赖 ...
- 【转帖】循序渐进Oracle:数据库的字符集和字符集文件
循序渐进Oracle:数据库的字符集和字符集文件 https://blog.csdn.net/Enmotech/article/details/100869162 2019年09月15日 18:23: ...
- 数据库相关概念讲解(java)
1.常用类或接口介绍 1.DataSource接口 通过javaAPI中javax.sql.DataSource接口注释了解. 1.DataSource功能 如下图: 翻译: DataSource对象 ...
- 消息中间件——RocketMQ(一) 环境搭建(完整版)
每章一点正能量:每当你想要放弃的时候,就想想是为了什么才一路坚持到现在. 前言 最近在回顾复习Java基础中的一些知识点,发现了一些以前见过但是没有留意却特别有意思的知识特性,比如这次想分享的Java ...