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 ...
随机推荐
- redis基础学习
redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了java ...
- 1.SpringBoot整合Mybatis(CRUD的实现)
准备工具:IDEA jdk1.8 Navicat for MySQL Postman 一.新建Project 选择依赖:mybatis Web Mysql JDBC 项目结构 pom依赖: & ...
- SpringCloud 第一篇:服务的注册和发现(Eureka)
一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...
- 求二叉搜索树的第k小的节点
题目描述: /** * 给定一棵二叉搜索树,请找出其中的第k小的结点. * 例如, (5,3,7,2,4,6,8)中, * 按结点数值大小顺序第三小结点的值为4. * 这是层序遍历: * 5 * 3 ...
- <现代C++实战30讲>笔记 01 | 堆、栈、RAII:C++里该如何管理资源?
1.堆(heap),动态分配的内存区域,分配之后需手工释放(new, delete, malloc, free) 这种方式需要分配内存,释放内存,因此可能会造成内存泄露,或者内存碎片的问题. 2.栈( ...
- 使用rpm安装mysql5.6(简单安装 实验使用)
[root@localhost mysql]# cd /usr [root@localhost mysql]# mkdir mysql [root@localhost mysql]# cd mysql ...
- radio(单选框)/checkbox(复选框) 美化
由于某种原因,可能需要对单选框(radio)或复选框(checkbox)进行美化,那么直接修改样式是行不通,要实现就需要添加js,以下js依赖于jquery radio.js: function ra ...
- STM32的系统时钟设置SystemClock_Config()探究
一.首先了解几个硬件名词: stm32有多种时钟源,为HSE.HSI.LSE.LSI.PLL,对于L系统的,还有一个专门的MSI 1.HSE是高速外部时钟,一般8M的晶振,精度比较高,比较稳定. 2. ...
- G. Gangsters in Central City
给出一棵$1$为根节点的含$n$个节点的树,叶子节点都是房屋,在一个集合里面添加房屋和移除房屋. 每一次添加和移除后,回答下面两个问题. 1. 使得已选房屋都不能从根节点到达,最少需要砍多少条边. ...
- String类型中"=="和"equals"的区别
"=="比较的是两个字符串的内存地址. "equals"比较的是两个字符串的实际值. 例子1. String s1="abc"; Stri ...