fork/join框架Java
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相关推荐
- Java并发编程(07):Fork/Join框架机制详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...
- fork join框架_Java 7:Fork / Join框架示例
fork join框架 Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计,并将这些任务的结果组合起来以产生最终结果. 通常,使用Fork / Join Fra ...
- java fork join原理_细说Fork/Join框架
什么是Fork/Join框架? Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork就是把一个大 ...
- Java并发-Fork/Join框架
参考博客:https://www.infoq.cn/article/fork-join-introduction 1. 什么是 Fork/Join 框架 Fork/Join 框架是 Java7 提供了 ...
- java 中的fork join框架
文章目录 ForkJoinPool ForkJoinWorkerThread ForkJoinTask 在ForkJoinPool中提交Task java 中的fork join框架 fork joi ...
- Java Fork/Join 框架
转载自 http://www.importnew.com/27334.html Doug Lea 大神关于Java 7引入的他写的Fork/Join框架的论文. 响应式编程(Reactive Prog ...
- Java 7:满足Fork / Join框架
JSR-166(y)是Java 7中包含的此新功能的正式名称.如果您发现名称中有一个" y",这是因为自Java 5起就添加了JSR-166(并发实用程序) ,但它不会就此停止,因 ...
- Java:使用Fork / Join框架的Mergesort
此项的目的是显示一个Fork / Join RecursiveAction的简单示例,而不是过多地研究合并合并的可能优化方法,或者比使用Exkutor / Join Pool优于现有的基于Java 6 ...
- java forkjoinpool_Java并发——Fork/Join框架与ForkJoinPool
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
最新文章
- 高中计算机的基本知识教学,高中计算机教案人教版
- TCP长连接和短连接
- SSM(springMVC-spring-mybatis)环境搭建-01-建立Maven-web项目
- 第五章(5)Libgdx应用框架之线程
- # 日期待t_2020最值得期待的几款新车
- android banner阴影,仿照锤子科技官网的banner 3d效果
- Chrome的vimium插件的使用笔记
- Qt通过ODBC读取excel文件
- os sys hashlib
- MFC制作打地鼠小游戏
- 李沐老师在伯克利开新课了,深度学习教材已经开源,视频也会有的
- 如何避免delete和delete[]的尴尬?
- ux.form.field.KindEditor 所见所得编辑器
- Shell脚本-tr 将大写字母变为小写
- python调用cmd执行命令_python怎么运行cmd命令
- 台式计算机显卡驱动位置,台式电脑独立显卡怎么安装驱动的
- Qt的简单应用:五子棋游戏
- 蓝牙耳机哪款打游戏最好用?值得入手的四款低延迟游戏蓝牙耳机
- https://www.yearbookchina.com
- 记:从零开始讲解UDS(一)——协议概述