1.fork-join概括

fork-join使用的是一种分而治之的一种思想模式,大数据里面也用得很多这种思想比如常见的MapReduce编程模型,分而治之就是把一个很大的任务拆分成很多个小任务并且小任务之间毫无关联,这个就是分而治之,与之相关的还有一个动态规划,动态规划也是拆分很多个小任务,但是与分而治之不同的是他的小任务之间有依赖关联,听了这些小伙伴们应该了解fork-join框架是个什么了吧,fork-join本质上来说就是一个递归,把一个大任务利用递归拆分成很多小任务,任务处理完毕,在使用递归一级一级的往上面提交,有点消耗性能。

2.fork-join内部执行规划概括

一般使用fork-join是需要在合适的场景下使用的,比如数据量很大的一个统计,数据量很大的一个排序,等一些需要很大的计算能力的地方都可以使用fork-join,但是一些比如我只有1000个数据进行求和那就没必要用fork-join了,因为fork-join是采用递归的特别消耗性能,还有一些线程并行结果数据统计,运行的时间肯定会比单线程去进行1000个数据求和慢得多,需要自适应场景

forjoin内部并行处理线程数:根据电脑的CPU逻辑处理器个数来定的

注意:内部采用多线程并行处理执行,并不是单线程执行

ForJoinPool具体参数也是可以自己设置的:

parallelism:设置线程数量

下面介绍几个ForkJoinPool常用方法跟任务类:

invoke:跟主线程同步执行,他不代表ForkJoin内部线程采用同步执行,就是主线程执行到这一步阻塞,必须要等invoke执行完毕再往下面继续执行,有返回结果集

execute:不会跟主线程同步执行,就是主线程执行到这一步不会阻塞,可以继续往下面执行,没有返回结果集

submit:不会跟主线程同步执行,就是主线程执行到这一步不会阻塞,可以继续往下面执行,有任务返回结果集

任务的join方法:等待当前任务执行完毕,执行完毕才可以继续往下执行

RecursiveTask<V>:ForkJoin的递归任务逻辑处理抽象类,继承了他重新compute计算方法实现自己的递归拆分逻辑,有返回结果集

RecursiveAction :ForkJoin的递归任务逻辑处理抽象类,继承了他重新compute计算方法实现自己的递归拆分逻辑,无返回结果集,适合使用execute启动使用


实战前准备实战的生成数组:

public class MakeArray {//数组最大长度public static int arrayLength=3000000;//任务拆分最小单位,拆分到这个单位就不能拆分了,即阈值public static int splitMixThreshold=(arrayLength/10);public static int[] make(){int[] origin=new int[arrayLength];Random random=new Random();for (int i = 0; i < arrayLength; ++i) {origin[i]=random.nextInt(arrayLength*3);}return origin;}}

3.fork-join实战实现数组累加

具体思路:

1.把随机生成3亿长度的数组拆分到最小单位,即上面数组生成中设置的阈值,(3亿除于10=30000000)一个数组长度,可以自己设置

2.符合阈值内的长度的数组直接用for循环累加运算

3.不符合阈值内的长度继续使用递归拆分,并且往上递交累加结果集

具体代码:

public class SumForkJoin {/** 创建ForkJoin框架  递归进入任务拆分,递归出来任务结果累加 **/static class SumTask extends RecursiveTask<Integer>{int[] recursiveArray;//划分开始位置int form;//划分结束位置int to;public SumTask(int[] recursiveArray, int form, int to) {this.recursiveArray = recursiveArray;this.form = form;this.to = to;}@Overrideprotected Integer compute() {//判断当前数组最小长度阈值,没有达到继续拆分if((to-form)< MakeArray.splitMixThreshold){//满足阈值的数组处理,累加int count= 0;for(int i=form;i<to;++i){count+=recursiveArray[i];}return count;}else{//数组长度划半int half=(form+to)/2;//递归拆分SumTask left=new SumTask(recursiveArray,form,half);SumTask right=new SumTask(recursiveArray,half+1,to);invokeAll(left,right);//等待最小阈值求和完毕在累加返回给上一层Join任务return left.join()+right.join();}}}public static void main(String[] args) {ForkJoinPool forkJoinPool=new ForkJoinPool();int[] array=MakeArray.make();SumTask sumTask=new SumTask(array,0,array.length-1);Long recordTime=System.currentTimeMillis();forkJoinPool.submit(sumTask);System.out.println("数组累加最终结果:"+sumTask.join()+",耗时时长:"+(System.currentTimeMillis()-recordTime)+"ms");}}

我还特意写了个单线程执行累加的,让小伙伴们明白,fork-join框架不是随意什么地方都可以使用的。

单线程累加具体代码:

public class MainSum {public static void main(String[] args) {int[] array= MakeArray.make();int sum=0;System.out.println("开始计时!");long recordTime=System.currentTimeMillis();for (int i = 0; i < array.length; ++i) {sum+=array[i];}System.out.println("数组累加最终结果:"+sum+",耗时时长:"+(System.currentTimeMillis()-recordTime)+"ms");}}

单线程累加 VS ForkJoin并行线程累加

单线程启动:

ForkJoin并行线程启动:

需要更多教程,微信扫码即可

fork-join详解(1)相关推荐

  1. 【Linux系统编程】fork()函数详解

    00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...

  2. linux fork 用法,Linux系统调用fork()用法详解

    linux 系统调用fork()的用法详解 Linux系统调用fork()用法详解 1. 先看下面代码: #include #include //pid_t类型定义 #include //函数fork ...

  3. left join详解

    left join详解 1.不考虑where条件下,left join 会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符合就显示,不符合全部为null) 2.在匹配阶段,where ...

  4. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  5. getpid php,对python中的os.getpid()和os.fork()函数详解

    如下所示: import os import sys import time processNmae = 'parent' print "Program executing ntpid:%d ...

  6. oracle join详解,inner join和left join之间的区别详解

    前言 关于inner join 与 left join 之间的区别,以前以为自己搞懂了,今天从前端取参数的时候发现不是预想中的结果,才知道问题出在inner join 上了. 需求是从数据库查数据,在 ...

  7. Linux的fork实现原理,【Linux】Fork炸弹详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序 ...

  8. Java Thread.join()详解

     一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用joi ...

  9. java threas.jion_Java Thread.join详解

    使用方法 Thread t = new ThreadA(); t.start(); t.join(); 为什么要用 join() 方法 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的 ...

  10. linux中的fork函数详解

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程.在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID.我们可以通过fork返回的值来 ...

最新文章

  1. 介绍一个懒人创建springmvc项目的方法(二)
  2. CSS自学教程--一天搞定CSS(终篇总结)
  3. 计算机音乐乐谱再也没有,再也没有简谱-Ryan.B/杨佬叁演唱-孙世彦制谱
  4. 操作系统课设之内存管理
  5. 计算机专项能力局域网管理,全国计算机信息技术考试局域网管理(Windows NT平台)管理员级考试考试大纲...
  6. matlab除fread外,Matlab中fread函数的高级使用方法及其帮助文档中容易引起歧义的地方...
  7. 推特称攻击者利用其 API 匹配用户名和电话号码
  8. Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)
  9. 剑指_4二维数组的查找(Python)
  10. U盘安装Ubuntu操作系统
  11. 各大物联网平台对比之百度IoT云平台
  12. 国开计算机实操题操作,国开大学计算机实操答案一.
  13. 网页提示https“证书错误:导航已阻止”,无法跳转解决办法
  14. 限时免费!2016杭州云栖大会抢票指南
  15. 大数据联姻“互联网+”驱动绿色变革
  16. linux搭建天地伟业easy7,easy7视频监控系统客户端|天地伟业easy7监控客户端简洁版(Easy7 Smart Client Express)下载 V7.12 官方版 - 比克尔下载...
  17. 2017企业网盘年终盘点|机遇与挑战并存,寡头显现
  18. word不能复制粘贴,提示激活宏
  19. iOS开发之2块钱一根的数据线能用多久
  20. 读《追风筝的人》有感

热门文章

  1. iPhone 12全系渲染图曝光:还有无数果粉期待的小屏神机
  2. 双11数据过于完美涉嫌造假?天猫:造谣要负法律责任的哦
  3. 很强势!因拒绝退回用户保证金,知名在线旅游平台成“老赖”,回应...
  4. 给广告打“保”字标、弄风险提示 百度搜索为用户旅游操碎了心
  5. 华为Mate 30 Pro全新配色曝光:“赤茶橘”颜值超高
  6. 已量产!华为Mate 30系列新机现身地铁:屏幕震撼
  7. 又一台苹果第一代电脑顺利拍卖:成交价超过47万美元
  8. 爱过!HTC悄然撤离中国内地市场:京东、天猫旗舰店已全部关闭
  9. 史上最拉风年货?苏宁门店私人飞机开售 网友:这个真香不了吧
  10. U-Boot提供的命令【整理】