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 ...
随机推荐
- Qualcomm_Mobile_OpenCL.pdf 翻译-1
1 前言 1.1 目的 这篇文档的主要目的是,向原始设备制造商(OEMs),独立软件供应商(ISVs),第三方开发者们,提供在基于高通骁龙400系列.600系列,和800系列的手机平台和芯片上进行开发 ...
- CentOS 7.x and RHEL 7.x Install qemu-kvm
ref: https://www.linuxtechi.com/install-kvm-hypervisor-on-centos-7-and-rhel-7/ https://www.th ...
- Mac安装PHP(Homebrew/php弃用、其他第三方tap也已经弃用或者迁移后的安装配置方案)
一.前言 看网上很多资料,大多数都是 mac安装php,只需要: brew tap homebrew/php brew install phpXX 安装php扩展只需要: brew install p ...
- 测试人员必备:linux文件清理不得不知道的技巧
测试人员最常见和繁琐的任务之一就是清理系统,比如防止磁盘空间出现不足.下面是我收集的一些常用的 Linux 文件系统相关命令. 一 检查可用空间 要查找服务器上所有文件系统上的可用空间,请执行以下命令 ...
- Highcharts基本名词解释
1.Highcharts基本组成: 2.名词解释 lang 语言文字对象 所有Highcharts文字相关的设置 chart 图表 图表区.图形区和通用图表配置选项 colors 颜色 图表数据列颜色 ...
- LocalDatetime 与 mybatis、json的坑
总所周知,localdatetime是jdk8 推出的关于日期计算非常方便地一个类,一旦开始用上就欲罢不能.但是在使用的时候,坑还是蛮多的. 一.mybatis与LocalDatetime 如果直接将 ...
- POJ3311Hie with the Pie(floyd传递+DP,状态压缩)
问题 The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfo ...
- Angular4.x+Ionic3 踩坑之路之 Ionic3.x pop反向传值
1.Ionic3.x 页面正向传值 关于正向传值,上一篇文章里面有讲,具体可以看这里https://segmentfault.com/a/11... 2.Ionic3.x 页面 pop反向传值,主要有 ...
- k8s管理pod资源对象(上)
一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...
- PHP---pdo和mongodb的操作使用
<?php $pdo = new PDO("mysql:host=127.0.0.1;dbname=testdb","root","123456 ...