- 浏览: 587803 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
13256591118:
0d47afd11cbbe1e95b450395e9632e7 ...
Oracle官方教程之Fork/Join,转载自:并发编程网 -
自己811005:
61411fe54f461f31e60336d7d0ab699 ...
Oracle官方教程之Fork/Join,转载自:并发编程网 -
xiaozhang0731:
suse11.3硬盘安装及注意事项
fork/join框架是ExecutorService接口的一种具体实现,目的是为了帮助你更好地利用多处理器带来的好处。它是为那些能够被递归地拆解成子任务的工作类型量身设计的。其目的在于能够使用所有可用的运算能力来提升你的应用的性能。
类似于ExecutorService接口的其他实现,fork/join框架会将任务分发给线程池中的工作线程。fork/join框架的独特之处在与它使用工作窃取(work-stealing)算法。完成自己的工作而处于空闲的工作线程能够从其他仍然处于忙碌(busy)状态的工作线程处窃取等待执行的任务。
fork/join框架的核心是ForkJoinPool类,它是对AbstractExecutorService类的扩展。ForkJoinPool实现了工作偷取算法,并可以执行ForkJoinTask任务。
基本使用方法
使用fork/join框架的第一步是编写执行一部分工作的代码。你的代码结构看起来应该与下面所示的伪代码类似:
你需要将这段代码包裹在一个ForkJoinTask的子类中。不过,通常情况下会使用一种更为具体的的类型,或者是RecursiveTask(会返回一个结果),或者是RecursiveAction。
当你的ForkJoinTask子类准备好了,创建一个代表所有需要完成工作的对象,然后将其作为参数传递给一个ForkJoinPool实例的invoke()方法即可。
要清晰,先模糊
想要了解fork/join框架的基本工作原理,接下来的这个例子会有所帮助。假设你想要模糊一张图片。原始的source图片由一个整数的数组表示,每个整数表示一个像素点的颜色数值。与source图片相同,模糊之后的destination图片也由一个整数数组表示。
对图片的模糊操作是通过对source数组中的每一个像素点进行处理完成的。处理的过程是这样的:将每个像素点的色值取出,与周围像素的色值(红、黄、蓝三个组成部分)放在一起取平均值,得到的结果被放入destination数组。因为一张图片会由一个很大的数组来表示,这个流程会花费一段较长的时间。如果使用fork/join框架来实现这个模糊算法,你就能够借助多处理器系统的并行处理能力。下面是上述算法结合fork/join框架的一种简单实现:
接下来你需要实现父类中的compute()方法,它会直接执行模糊处理,或者将当前的工作拆分成两个更小的任务。数组的长度可以作为一个简单的阀值来判断任务是应该直接完成还是应该被拆分。
如果前面这个方法是在一个RecursiveAction的子类中,那么设置任务在ForkJoinPool中执行就再直观不过了。通常会包含以下一些步骤:
1、创建一个表示所有需要完成工作的任务。
2、创建将要用来执行任务的ForkJoinPool。
3、执行任务。
想要浏览完成的源代码,请查看ForkBlur,其中还包含一些创建destination图片文件的额外代码。
标准实现
除了能够使用fork/join框架来实现能够在多处理系统中被并行执行的定制化算法(如前文中的ForkBlur.java例子),在Java SE中一些比较常用的功能点也已经使用fork/join框架来实现了。在Java SE 8中,java.util.Arrays类的一系列parallelSort()方法就使用了fork/join来实现。这些方法与sort()系列方法很类似,但是通过使用fork/join框架,借助了并发来完成相关工作。在多处理器系统中,对大数组的并行排序会比串行排序更快。这些方法究竟是如何运用fork/join框架并不在本教程的讨论范围内。想要了解更多的信息,请参见Java API文档。
其他采用了fork/join框架的方法还包括java.util.streams包中的一些方法,此包是作为Java SE 8发行版中Project Lambda的一部分。想要了解更多信息,请参见Lambda Expressions一节。
转载地址:http://ifeve.com/forkjoin/#more-9081
类似于ExecutorService接口的其他实现,fork/join框架会将任务分发给线程池中的工作线程。fork/join框架的独特之处在与它使用工作窃取(work-stealing)算法。完成自己的工作而处于空闲的工作线程能够从其他仍然处于忙碌(busy)状态的工作线程处窃取等待执行的任务。
fork/join框架的核心是ForkJoinPool类,它是对AbstractExecutorService类的扩展。ForkJoinPool实现了工作偷取算法,并可以执行ForkJoinTask任务。
基本使用方法
使用fork/join框架的第一步是编写执行一部分工作的代码。你的代码结构看起来应该与下面所示的伪代码类似:
if (当前这个任务工作量足够小) 直接完成这个任务 else 将这个任务或这部分工作分解成两个部分 分别触发(invoke)这两个子任务的执行,并等待结果
你需要将这段代码包裹在一个ForkJoinTask的子类中。不过,通常情况下会使用一种更为具体的的类型,或者是RecursiveTask(会返回一个结果),或者是RecursiveAction。
当你的ForkJoinTask子类准备好了,创建一个代表所有需要完成工作的对象,然后将其作为参数传递给一个ForkJoinPool实例的invoke()方法即可。
要清晰,先模糊
想要了解fork/join框架的基本工作原理,接下来的这个例子会有所帮助。假设你想要模糊一张图片。原始的source图片由一个整数的数组表示,每个整数表示一个像素点的颜色数值。与source图片相同,模糊之后的destination图片也由一个整数数组表示。
对图片的模糊操作是通过对source数组中的每一个像素点进行处理完成的。处理的过程是这样的:将每个像素点的色值取出,与周围像素的色值(红、黄、蓝三个组成部分)放在一起取平均值,得到的结果被放入destination数组。因为一张图片会由一个很大的数组来表示,这个流程会花费一段较长的时间。如果使用fork/join框架来实现这个模糊算法,你就能够借助多处理器系统的并行处理能力。下面是上述算法结合fork/join框架的一种简单实现:
public class ForkBlur extends RecursiveAction { private int[] mSource; private int mStart; private int mLength; private int[] mDestination; // Processing window size; should be odd. private int mBlurWidth = 15; public ForkBlur(int[] src, int start, int length, int[] dst) { mSource = src; mStart = start; mLength = length; mDestination = dst; } protected void computeDirectly() { int sidePixels = (mBlurWidth - 1) / 2; for (int index = mStart; index &lt; mStart + mLength; index++) { // Calculate average. float rt = 0, gt = 0, bt = 0; for (int mi = -sidePixels; mi &lt;= sidePixels; mi++) { int mindex = Math.min(Math.max(mi + index, 0), mSource.length - 1); int pixel = mSource[mindex]; rt += (float)((pixel & 0x00ff0000) >> 16) / mBlurWidth; gt += (float)((pixel & 0x0000ff00) >> 8) / mBlurWidth; bt += (float)((pixel & 0x000000ff) >> 0) / mBlurWidth; } // Reassemble destination pixel. int dpixel = (0xff000000 ) | (((int)rt) << 16) | (((int)gt) << 8) | (((int)bt) << 0); mDestination[index] = dpixel; } }
接下来你需要实现父类中的compute()方法,它会直接执行模糊处理,或者将当前的工作拆分成两个更小的任务。数组的长度可以作为一个简单的阀值来判断任务是应该直接完成还是应该被拆分。
protected static int sThreshold = 100000; protected void compute() { if (mLength < sThreshold) { computeDirectly(); return; } int split = mLength / 2; invokeAll(new ForkBlur(mSource, mStart, split, mDestination), new ForkBlur(mSource, mStart + split, mLength - split, mDestination)); }
如果前面这个方法是在一个RecursiveAction的子类中,那么设置任务在ForkJoinPool中执行就再直观不过了。通常会包含以下一些步骤:
1、创建一个表示所有需要完成工作的任务。
// source image pixels are in src // destination image pixels are in dst ForkBlur fb = new ForkBlur(src, 0, src.length, dst);
2、创建将要用来执行任务的ForkJoinPool。
ForkJoinPool pool = new ForkJoinPool();
3、执行任务。
pool.invoke(fb);
想要浏览完成的源代码,请查看ForkBlur,其中还包含一些创建destination图片文件的额外代码。
标准实现
除了能够使用fork/join框架来实现能够在多处理系统中被并行执行的定制化算法(如前文中的ForkBlur.java例子),在Java SE中一些比较常用的功能点也已经使用fork/join框架来实现了。在Java SE 8中,java.util.Arrays类的一系列parallelSort()方法就使用了fork/join来实现。这些方法与sort()系列方法很类似,但是通过使用fork/join框架,借助了并发来完成相关工作。在多处理器系统中,对大数组的并行排序会比串行排序更快。这些方法究竟是如何运用fork/join框架并不在本教程的讨论范围内。想要了解更多的信息,请参见Java API文档。
其他采用了fork/join框架的方法还包括java.util.streams包中的一些方法,此包是作为Java SE 8发行版中Project Lambda的一部分。想要了解更多信息,请参见Lambda Expressions一节。
转载地址:http://ifeve.com/forkjoin/#more-9081
评论
2 楼
13256591118
2018-01-24
0d47afd11cbbe1e95b450395e9632e74
1 楼
自己811005
2018-01-15
61411fe54f461f31e60336d7d0ab699e
发表评论
-
The Synthetic attribute
2015-01-02 09:16 0The Synthetic attribute is a fi ... -
Jdk5.0新特性Generic Types (泛型),转载自:中国IT实验室
2014-12-05 17:43 01. 介绍 2.定义简单Java泛型 其实Java的泛 ... -
为RMI实现类Jini的发现机制,转载自:51CTO
2014-12-02 15:48 0如果你从事过Jini开发,你会知道Jini客户端是不需要知道服 ... -
jini和RMI开发中的codebase问题,转载自:CCID
2014-12-02 14:41 0codebase问题其实是一个怎样从网络上下载类的问题,我想不 ... -
深入研究 Java Synchronize 和 Lock 的区别与用法,转载自:natian306的专栏
2014-11-18 23:01 0在分布式开发中,锁是 ... -
super与this
2014-11-14 18:00 0class FieldBase { int i = ... -
ACC_SUPER和早期的invokespecial,转载自:ITNose
2014-11-14 17:46 0class文件中的access flag记 ... -
Java的多维数组,转载自: Script Ahead, Code Behind
2014-11-12 18:09 0Java和JVM里本来就没有所谓的“矩形数组”的概念,多维数组 ... -
strictfp,与“移植”有染,与“精确”无关,转载自:fbysss的专栏
2014-11-12 11:00 0一、前言 本文是针 ... -
关于Java中的IEEE765浮点数表示法,转载自:不懂不懂
2014-11-11 16:55 0float转十六进制: 16进制浮点数的表示方法,根据IEE ... -
左移、右移、算术、逻辑
2014-11-10 15:37 0逻辑左移=算数左移,右边统一添0 逻辑右移,左边统一添0 ... -
java中的常量
2014-11-07 10:14 0会条件编译 public class TestConstant ... -
类装载器、双亲委托模型、命名空间、安全性,转载自:yuan22003的专栏
2014-11-05 13:03 0一. 基本概念 类加载器是用来把类 class 装载入 ... -
方法重载
2014-11-04 14:58 0Java编译器的方法特征签 ... -
常量池中没有<cinit>的Methodref
2014-10-31 11:13 0主要原因是<cinit>不会被字节码调用,只会被j ... -
Java Class字节码文件中long/double类型的常量在常量池中占据两个索引
2014-10-31 10:09 0Java Virtual Machine Specificat ... -
深入Java虚拟机读书笔记之:第3章 安全(3),转载自:2014-改变自己,深入技术
2014-10-27 14:25 0策略 Java安全体系结构的真正好处在于,它可以对代码授予 ... -
浅谈Java访问控制机制,转载自:51CTO
2014-10-27 14:07 0Java 访问控制机制 ... -
单例与反射,转载自:technonstop
2014-10-24 09:58 0The singleton design pattern in ... -
深入Java核心:JVM中的栈和局部变量,转载自:51CTO
2014-10-20 16:21 0Java开发中,每当我们在程序中使用new生成一个对象,对象的 ...
相关推荐
Fork/Join例子
fork join 框架 生产使用实例,可以直接修改配置,实现业务。
Fork/Join框架Package jsr166y是Java 7并行编程类的的初步版本(Preliminary versions of classes targeted for Java 7.)
而 JDK 7 中将会加入的 Fork/Join 模式是处理并行编程的一个经典的方法。虽然不能解决所有的问题,但是在它的适用范围之内,能够轻松的利用多个 CPU 提供的计算资源来协作完成一个复杂的计算任务。通过利用 Fork/...
fork/join框架与其它ExecutorService的实现类相似,会给线程池中的线程分发任务,不同之处在于它使用了工作窃取算法,所谓工作窃取,指的是对那些处理完自身任务的线程,会从其它线程窃取任务执行。 fork/join...
1.ServerSocketChannel与SocketChannel通讯 2.java Fork/Join 与ThreadPool使用
译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!(Fork and Join Java也可以轻松地编写并发程序)
Java并发网文归并总结。Fork and join,比较详细
《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...
全书分为9章,涵盖了线程管理、线程同步、线程执行器、Fork/Join框架、并发集合、定制并发类、测试并发应用等内容。全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完...
一、 Fork/Join框架的介绍 21 1、实现步骤: 22 2、工作窃取算法 22 3、分而治之 23 4、Fork/Join使用的标准范式 24 5、Fork/Join框架的异常处理 26 6、Fork/Join框架的实现原理 26 二、闭锁CountDownLatch 28 1、...
java Fork Join框架及使用,java自带的多线程框架,来处理多线程的问题
全网第一篇通过图文介绍Fork/Join框架与CompleteableFuture的PPT
介绍了ForkJoin并发框架,供有java基础者学习,工作配合使用,附件带有PPT,介绍并发与并行区别,和ForkJoin代码范例,资源来自网络,分享分享!
fork()编程fork()编程fork()编程fork()编程fork()编程fork()编程fork()编程
赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...
高并发编程第三阶段34讲 ForkJoin框架之RecursiveAction_.mp4 高并发编程第三阶段35讲 Phaser工具的实战案例使用第一部分_.mp4 高并发编程第三阶段36讲 Phaser工具的实战案例使用第二部分_.mp4 高并发编程第...
fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能;设计的目的是为了处理那些可以被递归拆分的任务。
Fork/Join框架是Java7中新增的一项特性,也是Java7平台的其中一项主要改进。下面我们就来简单探讨下Java的Fork/Join框架