ForkJoin使用
一、Fork Join    
分而治之的办法
JDk为Fork/Join框架提供了很好的支持,我们想要用这个算法首先得创建一个Fork/Join任务,在JDK中这个任务就叫做:ForJoinTask,只要继承这个类就可以创建一个任务类,但是实际使用中并不是直接继承ForkJoinTask类,而是继承它的子类,它有两个子类,分别是RecursiveAction和RecursiveTask,它们之间的区别是是否返回任务结果,前者用于没有返回结果的任务,后者用于有返回结果的任务。
ForkJoinPool
RecursiveTask
RecursiveAction
二、RecursiveTask使用
ForkJoinPoolTest:
package com.cy.java8; import java.util.concurrent.ForkJoinPool;
import com.cy.java8.AccumulatorRecursiveAction.AccumulatorHelper; public class ForkJoinPoolTest { private static int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; public static void main(String[] args) {
System.out.println("result = " + calc()); AccumulatorRecursiveTask task = new AccumulatorRecursiveTask(0, data.length - 1, data);
ForkJoinPool forkJoinPool = new ForkJoinPool();
Integer result = forkJoinPool.invoke(task); //同步调用
System.out.println("AccumulatorRecursiveTask result = " + result); AccumulatorRecursiveAction action = new AccumulatorRecursiveAction(0, data.length - 1, data);
forkJoinPool.invoke(action);
System.out.println("AccumulatorRecursiveAction result = " + AccumulatorHelper.getResult());
AccumulatorHelper.reset();
} /**
* 普通方法计算data的和
*/
private static int calc() {
int result = 0;
for (int i = 0; i < data.length; i++) {
result += data[i];
}
return result;
}
}
AccumulatorRecursiveTask
package com.cy.java8; import java.util.concurrent.RecursiveTask; /**
* 继承RecursiveTask,用于与结果返回的任务
*/
public class AccumulatorRecursiveTask extends RecursiveTask<Integer> { //累加的起始下标值
private final int start;
private final int end;
private final int[] data; //阈值为3,当小于等于这个值的时候进行计算
private final int LIMIT = 3; public AccumulatorRecursiveTask(int start, int end, int[] data) {
this.start = start;
this.end = end;
this.data = data;
} @Override
protected Integer compute() {
if (end - start < LIMIT) {
int result = 0;
for (int i = start; i <= end; i++) {
result += data[i];
}
return result;
} int mid = (start + end) / 2; //分为两个任务
AccumulatorRecursiveTask left = new AccumulatorRecursiveTask(start, mid, data);
AccumulatorRecursiveTask right = new AccumulatorRecursiveTask(mid + 1, end, data);
/*
//执行子任务
left.fork();
right.fork();
//等待子任务完成
Integer leftResult = left.join();
Integer rightResult = right.join();
//合并子任务
return rightResult + leftResult;
*/ //提交任务
invokeAll(left, right);
return left.join() + right.join();
}
}
三、RecursiveAction使用
package com.cy.java8; import java.util.concurrent.RecursiveAction;
import java.util.concurrent.atomic.AtomicInteger; public class AccumulatorRecursiveAction extends RecursiveAction {
private int start;
private int end;
private int[] data;
private final int LIMIT = 3; public AccumulatorRecursiveAction(int start, int end, int[] data) {
this.start = start;
this.end = end;
this.data = data;
} @Override
protected void compute() {
if (end - start < LIMIT) {
for (int i = start; i <= end; i++) {
AccumulatorHelper.accumulate(data[i]);
}
} else {
int mid = (start + end) / 2;
AccumulatorRecursiveAction left = new AccumulatorRecursiveAction(start, mid, data);
AccumulatorRecursiveAction right = new AccumulatorRecursiveAction(mid + 1, end, data);
/*left.fork();
right.fork();
left.join();
right.join();*/
invokeAll(left, right);
}
} static class AccumulatorHelper{
private static final AtomicInteger result = new AtomicInteger(0); private static void accumulate(int value){
result.getAndAdd(value);
} public static int getResult(){
return result.get();
} public static void reset(){
result.set(0);
}
}
}
ForkJoinPoolTest的执行结果:
result = 55
AccumulatorRecursiveTask result = 55
AccumulatorRecursiveAction result = 55
注:
1、RecursiveAction 提供的方法 invokeAll()。它表示:启动所有的任务,并在所有任务都正常结束后返回。如果其中一个任务出现异常,则其它所有的任务都取消。invokeAll() 的参数还可以是任务的数组。
-----------
ForkJoin使用的更多相关文章
- Java并发之工具类 ForkJoin 任务分解
		Fork/Join框架的介绍 第一步分割任务.首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小. 第二步执行任务并合并结果.分割 ... 
- Java并发编程核心方法与框架-Fork-Join分治编程(一)
		在JDK1.7版本中提供了Fork-Join并行执行任务框架,它的主要作用是把大任务分割成若干个小任务,再对每个小任务得到的结果进行汇总,这种开发方法也叫做分治编程,可以极大地利用CPU资源,提高任务 ... 
- 混合使用 ForkJoin, Akka, Future 实现一千万个不重复整数的排序
		定位 本文适合于想要了解新语言 Scala 以及异步并发编程框架 Akka, Future 的筒鞋. 读完本文后,将了解如何使用 ForkJoin 框架.如何使用 Akka 构建并发程序.如何使用 ... 
- ForkJoin框架
		1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ... 
- [转]Java并发的四种风味:Thread、Executor、ForkJoin和Actor
		这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好几的解决方法,Executor服务.ForkJoin 框架以及计算中的Actor模型. Java并发编程的4种风格:T ... 
- JAVA并行框架学习之ForkJoin
		当硬件处理能力不能按照摩尔定律垂直发展的时候,选择了水平发展,多核处理器已经广泛应用.未来随着技术的进一步发展,可能出现成百上千个处理核心,但现有的程序运行在多核心处理器上并不能得到较大性能的提升,主 ... 
- Java 8 的 JVM 有多快?Fork-Join 性能基准测试
		Java 8 已经发布一段时间了,许多开发者已经开始使用 Java 8.本文也将讨论最新发布在 JDK 中的并发功能更新.事实上,JDK 中已经有多处java.util.concurrent 改动,但 ... 
- 6.跑步者--并行编程框架 ForkJoin
		本文如果您已经了解一般并行编程知识.了解Java concurrent部分如ExecutorService等相关内容. 虽说是Java的ForkJoin并行框架.但不要太在意Java,当中的思想在其他 ... 
- java fork-join框架应用和分析
		http://shmilyaw-hotmail-com.iteye.com/blog/1897636 java fork-join框架应用和分析 博客分类: concurrency multithre ... 
- Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
		原文发表于 2013 年 8 月 28 日 由 三石 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给出了Fork Join的实现.在Java SE 7的API中,多了ForkJoin ... 
随机推荐
- c++ 类的继承和多态例子
			类的继承例子: 以上个动态银河系的制作为例,假设我们定义了一个星星的类如下: class Star { public: Star(){} ~Star(){} void Init(); void Mov ... 
- composer问题集锦
			问题一:composer遇到Your configuration does not allow connection to 解决方案: 设置一个本地或全局的composer配置: composer c ... 
- BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]
			数 位 D P 开 long long 首先第一问是转化. 于是就可以二进制下DP了. 第二问是递推,假设最后$n-1$个01位的填法设为$f[i-1]$(方案包括 ... 
- JAVA学习第二周课后作业
			Java 的基本运行单位是类.类由数据成员和函数成员组成.变量之间可以相互转换.String是一个类.static是静态.全局的意思.经过测试,Java的枚举类型定义的Size与String一样都不是 ... 
- 关于jq中input的value值clone的问题
			如果想将input进行克隆,然后在后面显示出来并修改input里面的文字,这时就会发现一个问题,就是你克隆出来的value值始终是你克隆时的value,检查页面元素你就会发现,这时需要对克隆之后的in ... 
- [洛谷P2605] ZJOI2016 基站选址
			问题描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄不超过Si的范 ... 
- 1、Qt应用程序
			新建Qt Widgets Application,基类选择QWidget Qt项目特点(参考上图):头文件名与类名一样,成对出现 main.cpp代码解释如下 #include "mywid ... 
- eclipse切换工作空间
- web前端:上传文件夹(需支持多浏览器)
			在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ... 
- Nowcoder Sum of Maximum ( 容斥原理 && 拉格朗日插值法 )
			题目链接 题意 : 分析 : 分析就直接参考这个链接吧 ==> Click here 大体的思路就是 求和顺序不影响结果.故转化一下思路枚举每个最大值对答案的贡献最后累加就是结果 期间计数的过程 ... 
