Fork/Join是什么?

Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继续分解,然后每个小任务分别计算出结果再合并起来,最后将汇总的结果作为大任务结果。其思想和MapReduce的思想非常类似。对于任务的分割,要求各个子任务之间相互独立,能够并行独立地执行任务,互相之间不影响。

  • ForkJoinPool

ForkJoinPool是ForkJoin框架中的任务调度器,和ThreadPoolExecutor一样实现了自己的线程池,提供了三种调度子任务的方法:

  1. execute:异步执行指定任务,无返回结果;
  2. invoke、invokeAll:异步执行指定任务,等待完成才返回结果;
  3. submit:异步执行指定任务,并立即返回一个Future对象;
  4. ForkJoinTask

Fork/Join框架中的实际的执行任务类,有以下两种实现,一般继承这两种实现类即可。

  1. RecursiveAction:用于无结果返回的子任务;
  2. RecursiveTask:用于有结果返回的子任务;

Fork/Join框架实战

下面实现一个Fork/Join小例子,从1+2+...10亿,每个任务只能处理1000个数相加,超过1000个的自动分解成小任务并行处理;并展示了通过不使用Fork/Join和使用时的时间损耗对比。

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;public class ForkJoinTask extends RecursiveTask<Long> {private static final long MAX = 1000000000L;private static final long THRESHOLD = 1000L;private long start;private long end;public ForkJoinTask(long start, long end) {this.start = start;this.end = end;}public static void main(String[] args) {test();System.out.println("--------------------");testForkJoin();}private static void test() {System.out.println("test");long start = System.currentTimeMillis();Long sum = 0L;for (long i = 0L; i <= MAX; i++) {sum += i;}System.out.println(sum);System.out.println(System.currentTimeMillis() - start + "ms");}private static void testForkJoin() {System.out.println("testForkJoin");long start = System.currentTimeMillis();ForkJoinPool forkJoinPool = new ForkJoinPool();Long sum = forkJoinPool.invoke(new ForkJoinTask(1, MAX));System.out.println(sum);System.out.println(System.currentTimeMillis() - start + "ms");}@Overrideprotected Long compute() {long sum = 0;if (end - start <= THRESHOLD) {for (long i = start; i <= end; i++) {sum += i;}return sum;} else {long mid = (start + end) / 2;ForkJoinTask task1 = new ForkJoinTask(start, mid);task1.fork();ForkJoinTask task2 = new ForkJoinTask(mid + 1, end);task2.fork();return task1.join() + task2.join();}}}

这里需要计算结果,所以任务继承的是RecursiveTask类。ForkJoinTask需要实现compute方法,在这个方法里首先需要判断任务是否小于等于阈值1000,如果是就直接执行任务。否则分割成两个子任务,每个子任务在调用fork方法时,又会进入compute方法,看看当前子任务是否需要继续分割成孙任务,如果不需要继续分割,则执行当前子任务并返回结果。使用join方法会阻塞并等待子任务执行完并得到其结果。

程序输出:

test
500000000500000000
4992ms
--------------------
testForkJoin
500000000500000000
508ms

从结果看出,并行的时间损耗明显要少于串行的,这就是并行任务的好处。

尽管如此,在使用Fork/Join时也得注意,不要盲目使用。

  1. 如果任务拆解的很深,系统内的线程数量堆积,导致系统性能性能严重下降;
  2. 如果函数的调用栈很深,会导致栈内存溢出;

Java7----ForkJoin框架相关推荐

  1. Java7任务并行执行神器:ForkJoin框架

    转载自 Java7任务并行执行神器:Fork&Join框架 Fork/Join是什么? Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继 ...

  2. 分支合并 Fork-Join 框架

    一.什么是 Fork-Join Fork/Join框架是Java7提供了的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架,这种开发方法也叫分 ...

  3. 谈谈 ForkJoin 框架的设计与实现

    在了解Fork-Join之前,我们得先了解什么是并行计算. 并行计算 相对于串行计算,并行计算可以划分成时间并行和空间并行.时间并行即指令流水化,也就是流水线技术.比如说生产一辆小汽车,有特定的轮子车 ...

  4. java forkjoin MySQL_Java并发fork-join框架

    fork-join框架允许在几个工作进程中断某个任务,然后等待结果组合它们. 它在很大程度上利用了多处理器机器的生产能力. 以下是fork-join框架中使用的核心概念和对象. Fork Fork是一 ...

  5. Java ForkJoin 框架初探

    多核时代,编程语言如果不支持多核编程就OUT了,Java为了迎头赶上,在Java 8 版本增加大量支持多核编程的类库,如Stream等,Java 7开始支持的ForkJoin框架也是为了更好的支持多核 ...

  6. ForkJoin框架源码分析(详细)

    ForkJoin简介及使用 ForkJoin框架是CompletableFuture和java8 stream使用到的框架.主要用于分片处理的场景. 可以通过自定义分片粒度来实现任务分解.并行处理数据 ...

  7. JUC之ForkJoin框架

    ForkJoin ForkJoin是由JDK1.7后提供多线并发处理框架, ForkJoin的框架的基本思想是分而治之.使用ForkJoin将相同的计算任务通过多线程的进行执行, 从而能提高数据的计算 ...

  8. ForkJoin框架详解 一张图搞明白工作窃取(work-stealing)机制

    1 ForkJoin框架 1.1 ForkJoin框架 ForkJoinPool一种ExecutorService的实现,运行ForkJoinTask任务.ForkJoinPool区别于其它Execu ...

  9. 使用forkjoin框架分页查询所有数据的例子

    使用forkjoin框架分页查询所有数据的例子 import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor ...

  10. java中fork函数_java中的forkjoin框架的使用

    fork join框架是java 7中引入框架,这个框架的引入主要是为了提升并行计算的能力. fork join主要有两个步骤,第一就是fork,将一个大任务分成很多个小任务,第二就是join,将第一 ...

最新文章

  1. 设计模式5 行为模式
  2. 什么是html的编码方式,HTML网页中“&#19978;”是什么编码方式啊?网页中&# 爱问知识人...
  3. python教程:一篇文章让你理解字符串的格式化
  4. vue教程1:第一个页面HelloVue快速搭建
  5. matlab中方差直方图,如何规范直方图在MATLAB?
  6. [编程入门]宏定义之闰年判断:给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计
  7. freeswitch 使用mysql替换默认的sqlite
  8. [渝粤教育] 西南科技大学 成本会计 在线考试复习资料(1)
  9. 机器学习面试知识点总结
  10. flag计算机语言的意思,flag是什么意思-c语言flag的用法
  11. php发布iis0x80070005,iis 0x80070005 解决方法
  12. iPad 使用技巧:Safari 浏览器
  13. 有感于男人们的友谊和女人们的友谊
  14. 联想拯救者15isk清灰_拯救者15值得买吗?联想拯救者15isk游戏本全面深度评测图解...
  15. 《鸟哥的Linux私房菜》Chapter6 20180806~20180810
  16. 不同数据库之间表数据的copy及CPY 0012错误的解决办法
  17. 虚拟机Linux CentOS 7安装配置Tomcat10(适用于安装任何tomcat版本!!)
  18. win32汇编 MASM03
  19. ZUCC_Linux系统管理_实验四 用户和分组管理
  20. 【知乎Live】狼叔:如何正确的学习Node.js

热门文章

  1. 苹果上新了!新款iPad Pro发布:妙控键盘成最大惊喜
  2. 张朝阳寄语“校花”把参赛比做登山 走到不同阶段都是一种成就
  3. 还有必要吗?iPhone 11系列终于要全家族支持双卡双待了
  4. 京东进一步回应“承兴事件”:歌斐自身存在风控缺陷
  5. 短视频成青少年教育新工具:抖音等三机构联合发起“青椒计划”
  6. 货物被偷把沃尔玛逼急了 将在逾1000家门店安装AI相机
  7. 华为今年或发两款5G产品:5G CPE Win和5G随行WiFi
  8. 荣耀赵明反讽雷军:有些话不适合知识分子讲
  9. 弯道超车时机已来 百度:中国有机会定义AI时代的用户体验标准
  10. 十大笔记本品牌型号命名规则【三星、苹果、明基】