什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算

  • 什么是ForkJoin?
  • ForkJoin:分支合并
  • ForkJoin特点:工作窃取
  • 如何让使用ForkJoin
  • ForkJoin求和计算Demo

什么是ForkJoin?

ForkJoin(分支合并)是jdk1.7之后出来的,并行执行任务,提高效率,用在大数据量场景下。

大数据:Map Reduce(把大任务拆分成多个小任务,怎么拆分用到了二分算法),每个小任务得出自己的结果,之后再把结果汇总,汇总的过程就是分支合并的思想。

ForkJoin:分支合并

ForkJoin会把一个大任务分成若干个小任务去执行(任务是双端队列去存储的,两端都可以操作),然后再合并结果集。

ForkJoin特点:工作窃取

ForkJoin会把一个大任务分成若干个小任务去执行(任务是双端队列去存储的,两端都可以操作),然后再合并结果集。
线程的执行速度不一样,因此先执行完的线程,为了避免浪费时间,会去还没有执行完的线程那里拿到它未执行完的任务,去帮它执行,之所以能拿到,也是因为任务是双端队列存储的,两头都可以操作。

ForkJoinPool主要是为了并行计算使用(也就是新增加的并行流),但我觉得更适合IO密集型的场景。
比如大规模的并行查询。而CPU密集型的操作,过多的线程切换可能会影响效率

如何让使用ForkJoin

  • 1.ForkJoinPool,通过ForkJoinPool来执行
  • 2.计算任务forkJoinPool.execute(ForkJoinTask task)
  • 3.计算类要继承ForkJoinTask(执行任务RecursiveTask:有返回值 RecursiveAction:无返回值)

Class ForkJoinPool有一个异步执行任务的方法

我们需要用到有返回值的RecursiveTask

使用RecursiveTask需要继承RecursiveTask,并定义返回值类型

class Fibonacci extends RecursiveTask<Integer>

ForkJoin求和计算Demo

import java.util.concurrent.*;
import java.util.stream.LongStream;/*** 求和计算* 1.最low的:循环求和* 2.一般的:ForkJoin分支求和* 3.最快的:Stream并行流求和*/
public class ForkJoinDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {new ForkJoinDemo().test1();new ForkJoinDemo().test2();new ForkJoinDemo().test3();/*** test1===>和为500000000500000000,耗时9937* test2===>和为500000000500000000,耗时8622* test3===>和为500000000500000000,耗时276*/}//1.最low的:循环求和public void test1() {long start = System.currentTimeMillis();Long sum = 0L;for (Long i = 0L; i <= 10_0000_0000L; i++) {sum += i;}long end = System.currentTimeMillis();System.out.println("test1===>和为" + sum + ",耗时" + (end - start));}//2.一般的:ForkJoin分支求和public void test2() throws ExecutionException, InterruptedException {long start = System.currentTimeMillis();// 也可以使用公用的线程池 ForkJoinPool.commonPool():// pool = ForkJoinPool.commonPool()ForkJoinPool pool = new ForkJoinPool();ForkJoinTask<Long> task = pool.submit(new MySumForkJoin(0L, 10_0000_0000L));//提交任务Long sum = task.get();long end = System.currentTimeMillis();System.out.println("test2===>和为" + sum + ",耗时" + (end - start));}//3.最快的:Stream并行流求和public void test3() {//没有Long的拆箱装箱操作long start = System.currentTimeMillis();long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);//reduce第一个参数为0,为了保证,在进行流条件计算下,保证每次累计的值不受多线程影响long end = System.currentTimeMillis();System.out.println("test3===>和为" + sum + ",耗时" + (end - start));}
}/*** 如何让使用ForkJoin* 1.ForkJoinPool,通过ForkJoinPool来执行* 2.计算任务forkJoinPool.execute(ForkJoinTask task)* 3.计算类要继承ForkJoinTask(执行任务RecursiveTask:有返回值  RecursiveAction:无返回值)*/
class MySumForkJoin extends RecursiveTask<Long> {private Long start;//开始值private Long end;//结束值private Long criticalValue = 10000L;//临界值,超过这个值开始分任务执行public MySumForkJoin(Long start, Long end) {this.start = start;this.end = end;}//计算方法:递归调用的@Overrideprotected Long compute() {if (end - start <= criticalValue) {Long sum = 0L;for (Long i = start; i <= end; i++) {sum += i;}return sum;} else {//ForkJoin执行分支合并计算,
//            System.out.println("开始ForkJoin执行分支合并计算");//1.先求中间值Long middle = (start + end) / 2;//不直接(start+end)/2,防止溢出/*把任务一分为二,递归拆分(注意此处有递归)到底拆分成多少分 需要根据具体情况而定*/MySumForkJoin task1 = new MySumForkJoin(start, middle);MySumForkJoin task2 = new MySumForkJoin(middle + 1, end);
//            task1.fork();//拆分任务,把任务压入双端队列,这里手动只拆分成两个任务,可以拆分多个
//            task2.fork();//拆分任务,把任务压入双端队列invokeAll(task1, task2);//拆分任务,把任务压入双端队列/*** compute分出多个task后:以task1,task2为例* 错误做法:* 1)依次执行task1.fork(),task2.fork()* 2)依次执行task1.join(),task2.join()* 正确做法:* 1)直接调用invokeAll(task1,task2)** fork():* 把task置入当前ForkJoinWorkerThread的queue中,等待被消费* join():* 当前ForkJoinWorkerThread执行等待该task执行结束** 错误做法过程:* 将task1与task2置入queue中,当前ForkJoinWorkerThread停下来等待task1,task2的执行结束。** 分析:* 当前的ForkJoinWorkerThread可以说join之后什么事情都没有做,只是等待ing。而task1和task2会在新的线程中执行。* 会浪费当前ForkJoinWorkerThread的宝贵线程资源。而且最糟糕的是,会创建一个新的ForkJoinWorkerThread去执行新的task,可想而知,如果任务量特别多,那会同时开启特别多的线程。*/return task1.join() + task2.join();}}
}

什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算相关推荐

  1. TortoiseGit- 创建本地新分支,提交推送到远程,本地新分支合并到工作分支,提交到远程工作分支等。...

    整体思路: 创建本地新分支 (create branch)  -- 切换到本地新分支工作 (switch/checkout) --提交修改 (commit)  -- 推送到远程新分支 (push)  ...

  2. 从事程序员的工作,Python大数据、Java、前端,哪个有发展前景?

    首先我说大数据,现在有很多培训机构培训大数据,根据我多年的从业经验来看,大数据这名字听着不错,好像很高大上.但所谓培训"零基础"的.没有做过开发的人去学习大数据,就跟过家家是一样的 ...

  3. python架构师工作职责_大数据架构师岗位的工作职责

    大数据架构师需要负责深入理解业务需求,对业务建模,设计系统架构,满足业务需求.以下是学习啦小编整理的大数据架构师岗位的工作职责. 大数据架构师岗位的工作职责1 职责: 1.负责数据仓库建设,基于数据驱 ...

  4. 北京市金融工作局:大数据重塑未来金融监管方式

    ●回顾金融创新发展的历史,每一次金融的历史变革都与先进的科学技术紧密结合,因此当金融发展到互联网时代,也必将发生新的金融变革. ●建立互联网金融治理体系,应该成为我国金融治理体系和金融治理能力建设的重 ...

  5. python架构师工作职责_大数据架构师工作的岗位职责

    大数据架构师负责研发技术发展方向,新技术领域的探索,将新技术应用到公司大数据平台,提升公司效能.下面是学习啦小编整理的大数据架构师工作的岗位职责. 大数据架构师工作的岗位职责1 职责: 1.负责大数据 ...

  6. 大数据之-Hadoop3.x_MapReduce_ReduceTask工作机制并行度---大数据之hadoop3.x工作笔记0125

    然后我们继续看一下maptask的工作机制,这个前面也有提过了, 可以看到左边是maptask处理完的数据,然后到了reduceTask阶段,会首先把数据 拉取过来当然,是按照分区拉取的对吧.这是co ...

  7. Excel对不等的合并单元格进行多列数据求和操作

    如下图所示,这下小张遇到大难题了,按照合并单元格对前面3个月的销量,进行求和统计,关键是合并的单元格还不一样 (方方格子插件) 1.先看动图演示 2.插入辅助列后,我们将辅助列和数据区域进行统一的选择 ...

  8. 为什么Spark能成为最火的大数据计算引擎?它是怎样工作的?

    导读:零基础入门Spark必读. 作者:朱凯 来源:大数据DT(ID:hzdashuju) 01 概述 十年前我们只有Hadoop,大家首先通过HDFS实现海量数据的共享存储,然后使用MapReduc ...

  9. ConcurrentHashMap 锁分段技术 结构 ConcurrentLinkedQueue 阻塞队列 Fork/Join框架 工作窃取算法

    文章目录 ConcurrentHashMap 锁分段技术 结构 ConcurrentLinkedQueue 阻塞队列 Fork/Join框架 工作窃取算法 ConcurrentHashMap 锁分段技 ...

最新文章

  1. BZOJ2298 [HAOI2011]problem a
  2. java android统计图_Android统计图表之柱状图(条形图)
  3. nodejs mysql 注入_node.js sql 注入攻击防御方法 (sql Injection)
  4. ajax登录非空判断,email ajax传输数据去重和非空判断(示例代码)
  5. sql语句中的时间查询
  6. 短视频生产利器!视频裁剪之横屏转竖屏新技术,出自腾讯多媒体实验室
  7. 撩妹java代码_Java程序媛深入浅出设计模式中的撩妹神技--中篇
  8. Code Review 13 大必知必会,学习了!
  9. css滑动星星评分,纯css3滑动星星打分动画特效
  10. java抓取动态生成的网页
  11. 疯狂Java讲义(读书笔记)(第六章--Java基础类库)
  12. 随机微分方程学习笔记01 相对布朗运动的Ito积分
  13. java floor(),Java floor()用法及代码示例
  14. influxdb java api使用_InfluxDB使用HTTP的API查询数据
  15. html实现边下边播mp4,MP4Info: 不用流媒体也可以简单实现MP4等视频的边下边播功能。...
  16. C语言入门——初识C语言
  17. 旧手机(小米4)装linux的一个记录
  18. 南丁格尔玫瑰图 With ggplot2【R语言】
  19. 金融信息安全实训 课堂笔记5
  20. 【区块链基础】4——ETH区块结构

热门文章

  1. 软件项目管理-第三讲 软件项目的准备和启动
  2. 10个超好看 后台管理面板,再也不愁UI了
  3. Chrome撤销一律不翻译网页方法
  4. 教程▍一步步上手TensorFlow——基础知识
  5. Python可视化交互库——dash
  6. Hadoop Spark太重,esProc SPL很轻
  7. windows中dos命令汇总及获取管理员权限
  8. 只需百行代码,Python带你玩转汉服圈
  9. 洗碗机到底是神器,还是智商税?内行人告诉你答案,结果一目了然
  10. 有哪些免费的pdf编辑器