Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

Fork/Join使用两个类:

  • ForkJoinTask:我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()操作的机制,ork/Join框架提供了以下两个子类:

    • RecursiveAction:用于没有返回结果的任务。
    • RecursiveTask :用于有返回结果的任务。
  • ForkJoinPool :ForkJoinTask需要通过ForkJoinPool来执行,任务分割出的子任务会添加到当前工作线程所维护的双端队列中。

ForkJoinPool是一个执行ForkJoinTask的ExecutorService,ForkJoinPool提供no-ForkJoinTask客户端提交的入口点,以及管理和监视操作。

ForkJoinPool与其他类型的ExecutorService的不同之处主要在于使用工作窃取:池中的所有线程都尝试查找和执行提交给池的任务和/或由其他活动任务创建的任务(如果不存在则最终阻止等待工作)。当大多数任务产生其他子任务时(如大多数ForkJoinTasks),以及从外部客户端向池提交许多小任务时,这可以实现高效处理。特别是在构造函数中将asyncMode设置为true时,ForkJoinPools也可能适用于从未加入的事件样式任务。

static commonPool()适用于大多数应用程序,common pool由未显式提交到指定池的任何ForkJoinTask使用。使用common pool通常会减少资源使用(其线程在不使用期间缓慢回收,并在后续使用时恢复)。

然后我们写一个demo,这里DoTask继承了RecursiveAction,里面的有start和end,还有最多处理list中THRESHOLD条数据。

然后我们运行一下:

输出:

对于需要单独或自定义pool的应用程序,可以使用给定的目标并行度级别构造ForkJoinPool;默认情况下,等于可用处理器的数量。。

默认情况下,common pool使用默认参数构造,但可以通过设置三个系统属性来控制它们:

  • java.util.concurrent.ForkJoinPool.common.parallelism - 并行级别,这是一个非负整数。
  • java.util.concurrent.ForkJoinPool.common.threadFactory -  ForkJoinPool.ForkJoinWorkerThreadFactory 类
  • java.util.concurrent.ForkJoinPool.common.exceptionHandler - Thread.UncaughtExceptionHandler 类

此实现将最大运行线程数限制为32767.尝试创建大于最大数量的池会导致IllegalArgumentException。

仅当pool关闭或内部资源耗尽时,此实现才会拒绝提交的任务(即通过抛出RejectedExecutionException)。

下面摘录一段(https://www.cnblogs.com/wanly3643/p/3956801.html),等我看了Doug Lea大神的,再写一点:

仔细看了Doug Lea的那篇文章:A Java Fork/Join Framework 中关于Work-Stealing的部分,下面列出该算法的要点(基本是原文的翻译):

1. 每个Worker线程都维护一个任务队列,即ForkJoinWorkerThread中的任务队列。

2. 任务队列是双向队列,这样可以同时实现LIFO和FIFO。

3. 子任务会被加入到原先任务所在Worker线程的任务队列。

4. Worker线程用LIFO的方法取出任务,也就后进队列的任务先取出来(子任务总是后加入队列,但是需要先执行)。

5. Worker线程的任务队列为空,会随机从其他的线程的任务队列中拿走一个任务执行(所谓偷任务:steal work,FIFO的方式)。

6. 如果一个Worker线程遇到了join操作,而这时候正在处理其他任务,会等到这个任务结束。否则直接返回。

7. 如果一个Worker线程偷任务失败,它会用yield或者sleep之类的方法休息一会儿,再尝试偷任务(如果所有线程都是空闲状态,即没有任务运行,那么该线程也会进入阻塞状态等待新任务的到来)。

Doug Lea

参考:

http://ifeve.com/java-fork-join-framework/#more-35602

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html

http://gee.cs.oswego.edu/dl/papers/fj.pdf()

有什么讨论的内容,可以加我公众号:

fork/join框架Java相关推荐

  1. Java并发编程(07):Fork/Join框架机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...

  2. fork join框架_Java 7:Fork / Join框架示例

    fork join框架 Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计,并将这些任务的结果组合起来以产生最终结果. 通常,使用Fork / Join Fra ...

  3. java fork join原理_细说Fork/Join框架

    什么是Fork/Join框架? Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork就是把一个大 ...

  4. Java并发-Fork/Join框架

    参考博客:https://www.infoq.cn/article/fork-join-introduction 1. 什么是 Fork/Join 框架 Fork/Join 框架是 Java7 提供了 ...

  5. java 中的fork join框架

    文章目录 ForkJoinPool ForkJoinWorkerThread ForkJoinTask 在ForkJoinPool中提交Task java 中的fork join框架 fork joi ...

  6. Java Fork/Join 框架

    转载自 http://www.importnew.com/27334.html Doug Lea 大神关于Java 7引入的他写的Fork/Join框架的论文. 响应式编程(Reactive Prog ...

  7. Java 7:满足Fork / Join框架

    JSR-166(y)是Java 7中包含的此新功能的正式名称.如果您发现名称中有一个" y",这是因为自Java 5起就添加了JSR-166(并发实用程序) ,但它不会就此停止,因 ...

  8. Java:使用Fork / Join框架的Mergesort

    此项的目的是显示一个Fork / Join RecursiveAction的简单示例,而不是过多地研究合并合并的可能优化方法,或者比使用Exkutor / Join Pool优于现有的基于Java 6 ...

  9. java forkjoinpool_Java并发——Fork/Join框架与ForkJoinPool

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

最新文章

  1. 高中计算机的基本知识教学,高中计算机教案人教版
  2. TCP长连接和短连接
  3. SSM(springMVC-spring-mybatis)环境搭建-01-建立Maven-web项目
  4. 第五章(5)Libgdx应用框架之线程
  5. # 日期待t_2020最值得期待的几款新车
  6. android banner阴影,仿照锤子科技官网的banner 3d效果
  7. Chrome的vimium插件的使用笔记
  8. Qt通过ODBC读取excel文件
  9. os sys hashlib
  10. MFC制作打地鼠小游戏
  11. 李沐老师在伯克利开新课了,深度学习教材已经开源,视频也会有的
  12. 如何避免delete和delete[]的尴尬?
  13. ux.form.field.KindEditor 所见所得编辑器
  14. Shell脚本-tr 将大写字母变为小写
  15. python调用cmd执行命令_python怎么运行cmd命令
  16. 台式计算机显卡驱动位置,台式电脑独立显卡怎么安装驱动的
  17. Qt的简单应用:五子棋游戏
  18. 蓝牙耳机哪款打游戏最好用?值得入手的四款低延迟游戏蓝牙耳机
  19. https://www.yearbookchina.com
  20. 记:从零开始讲解UDS(一)——协议概述

热门文章

  1. Javascript访问Cookie的四个常用方法
  2. 已解决——pycharm在同目录下import,pycharm会提示错误,但是可以运行
  3. IPC生产者与消费者模型加线程
  4. wpf的控件style
  5. react-native 报错 RawText must be wrapped in an explicit Text component
  6. javase-字符串次数查找
  7. idea android 开发
  8. TSS ESS RSS
  9. 第三章:顺序栈及其应用之三---数制转换
  10. Eigen库数据结构内存对齐问题