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 ...
随机推荐
- Delphi 控制程序的执行
- ERA-interim
数据介绍整理中... https://software.ecmwf.int/wiki/display/UER/Time-integrated+surface+solar+radiation+downw ...
- 模块之time与datetime
模块之time与datetime import time print (time.clock()) print(time.process_time()) #测量处理器运算时间 print(time.a ...
- 二,kubernetes集群的安装初始化
目录 部署 集群架构示意图 部署环境 kubernetes集群部署步骤 基础环境 基础配置 安装基础组件 配置yum源 安装组件 初始化 master 设置docker和kubelet为自启动(nod ...
- ASP.NET c# 实验日记(1)
第一次写有一些紧张,以前学过html,c语言,vb,c#等语言.也自己翻过有关javascript的书,现在的目的是怎么把学习经验写的更具结构化和条理化,大佬勿喷. 在一个集成开发平台里第一步就是新建 ...
- 小程序UI设计之-介绍篇
工具截图 此工具通过可视化操作进行布局,依据iphone6尺寸设置画布,可以自动生成rpx和百分比的wxss.后续还会增加js代码自动生成.工具中组件按照微信小程序开发规范进行了缺省设置,margin ...
- web性能优化-浏览器渲染原理
在web性能优化-浏览器工作原理中讲到,浏览器渲染是在renderer process中完成的. 那我们来看下renderer process究竟干了什么? Renderer Process包含的线程 ...
- Liunx centos 系统 修改hostname
1 centos6下修改hostname [root@centos6 ~]$ hostname # 查看当前的hostnmae centos6.magedu.com [root@centos6 ~]$ ...
- 关于distinct的compare参数的使用
1.创建compare类 using DCZY.Bean; using System; using System.Collections.Generic; using System.Linq; usi ...
- django之路由层(反向解析)总结
表关系的建立方式 表与表之间的关系就三种 一对一 OneToOne(to='') # to后面可以跟字符串的表名 也可以直接跟变量名表名(该表名必须在上面提前定义出来) 一对多 ForeignKey( ...