十八、fork/join框架
一、简介
在hadoop的分布式计算框架MapReduce中,会经过两个过程Map过程和reduce过程。Map过程将任务并行计算,reduce汇总并行计算的结果,如图:

MapReduce是在分布式环境中做分布式计算的,JDK1.7+以后再单机环境中也可以做类似的操作,它提供了一种ForkJoin框架。
ForkJoin框架中,fork()操作将任务异步并行执行(类似生成一个Map操作),join()操作等待异步并行的结果,你可以将并行结果进行汇总(类似reduce操作),并通过Future等方式获取异步线程的执行结果,如图:

JDK文档:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html
ForkJoin框架可以将一个任务通过不断地分解,并行地执行更多的任务。在这种方式下,你需要合理控制它的分解程度,因为你可能一次性爆发非常多的线程消耗大量的资源,会适得其反。
二、代码示例
以下代码示例对一个集合内的数据进行加法运算,我们将集合不断地拆分成两两加法,然后并行执行汇总结果。最后通过Future获取异步结果
这里我们采用继承RecursiveTask<T>的方式来编写实现类,因为我们需要返回值,其泛型即返回值。
如果你的任务不需要返回值,你可以继承RecursiveAction来实现。
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask; public class ForkJoinDemo extends RecursiveTask<Integer> { private List<Integer> nums; public ForkJoinDemo(List<Integer> nums) {
this.nums = nums;
} @Override
protected Integer compute() {
// 如果只有一个数据,直接返回
if (nums.size() == 1) {
return nums.get(0);
// 如果两个数据,相加
} else if (nums.size() == 2) {
return nums.get(0) + nums.get(1);
// 否则拆分任务
} else {
// 拆分成两个任务异步执行,并等待异步结果
int result1 = new ForkJoinDemo(nums.subList(0, nums.size()/2)).fork().join();
int result2 = new ForkJoinDemo(nums.subList(nums.size()/2, nums.size())).fork().join();
// 汇总结果
int total = result1 + result2;
// 返回汇总结果
return total;
}
} public static void main(String[] args) throws ExecutionException, InterruptedException {
// 数据准备
Integer[] nums = {1,2,3,4,5,6,7,8,9};
List<Integer> list = Arrays.asList(nums);
// 初始化fork任务
ForkJoinDemo forkJoinDemo = new ForkJoinDemo(list);
// 初始化线程池
ForkJoinPool pool = new ForkJoinPool();
// 提交任务
Future<Integer> future = pool.submit(forkJoinDemo);
// 阻塞获取返回值
System.out.println(future.get());
}
}
最后输出:
45
在实际应用场景中,最麻烦的地方可能会是在于如何对要处理的数据进行划分。以上示例中,我们可以对集合按照大小进行切分,但如果是字符串或者流等数据。你需要注意,如何划分,以及在划分过程中,不会让数据因为划分而导致部分或者全部失效
十八、fork/join框架的更多相关文章
- 聊聊并发(八)——Fork/Join框架介绍
作者 方腾飞 发布于 2013年12月23日 | 被首富的“一个亿”刷屏?不如定个小目标,先把握住QCon上海的优惠吧!2 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 ...
- 转:聊聊并发(八)——Fork/Join框架介绍
1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...
- JAVA中的Fork/Join框架
看了下Java Tutorials中的fork/join章节,整理下. 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核 ...
- JDK7新特性之fork/join框架
The fork/join framework is an implementation of the ExecutorService interface that helps you take ad ...
- Java并发——Fork/Join框架
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
- Java并发编程--Fork/Join框架使用
上篇博客我们介绍了通过CyclicBarrier使线程同步,可是上述方法存在一个问题,那就是假设一个大任务跑了2个线程去完毕.假设线程2耗时比线程1多2倍.线程1完毕后必须等待线程2完毕.等待的过程线 ...
- 使用Java7提供Fork/Join框架
在Java7在.JDK它提供了多线程开发提供了一个非常强大的框架.这是Fork/Join框架.这是原来的Executors更多 进一步,在原来的基础上添加了并行分治计算中的一种Work-stealin ...
- 使用Java7提供的Fork/Join框架
http://blog.csdn.net/a352193394/article/details/39872923 使用Java7提供的Fork/Join框架 2014-10-07 23:55 4818 ...
- 实现ThreadFactory接口生成自定义的线程给Fork/Join框架
Fork/Join框架是Java7中最有趣的特征之一.它是Executor和ExecutorService接口的一个实现,允许你执行Callable和Runnable任务而不用管理这些执行线程.这个执 ...
- Java 7 Fork/Join 框架
在 Java7引入的诸多新特性中,Fork/Join 框架无疑是重要的一项.JSR166旨在标准化一个实质上可扩展的框架,以将并行计算的通用工具类组织成一个类似java.util中Collection ...
随机推荐
- 2018年秋PTA乙级回顾
距离上次我一个人参加PAT考试已经过去快一个学期了,想想上次自己也是搞笑,自己一个人被这个书包就去了ZZ,人生地不熟的,乘坐公交车还坐反了.考完试因为不知道要等到考试结束就可以领取成绩证书,自己连那张 ...
- “全栈2019”Java第一百章:局部内部类可以实现接口吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 《快学Scala》第五章 类
关于case class和普通class的区别,可以参考: https://www.iteblog.com/archives/1508.html
- 能够放在文档的 <head> 中的各种配置元素
一份关于任何可以写入到你的文档中 <head> 部分的清单 最小推荐 <meta charset="utf-8"> <meta http-equiv= ...
- CentOS 7 安装程序介绍
(一).引导菜单 使用 UEFI 引导 Install CentOS Linux 7 选择此选项开始在你的计算机系统中使用图形安装程序安装 CentOS 7 Test this media & ...
- 基于python的几种排序算法的实现
#!usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2019/3/28 10:26 # @Author : Yosef-夜雨声烦 # @Email ...
- mfix中统计气泡体积
先转换为point data 提取空隙率在0.45-1.0之间的网格,为后面提取气泡内网格做准备 把free board部分去掉 然后积分 选择cell data后就得到气泡内所有网格的体积和,如果网 ...
- HTML5创业的另一种可能
当一种新的颠覆式技术出现,是投靠大平台还是坚持走独立的道路? HTML5(下称H5)火了.在多数人还没完全弄清楚什么是H5时,它已悄无声息地潜入移动端,并渐呈燎原之势火速席卷云寻觅云寻觅. 以前,H5 ...
- MySQL error2003错误原因以及解决方案
转自:http://hi.baidu.com/tianxia339/item/8e8849111461ea7e7a5f2540 出现ERROR 2003 (HY000): Can't connect ...
- Ambari集群里操作时典型权限问题put: `/home/bigdata/1.txt': No such file or directory的解决方案(图文详解)
不多说,直接上干货! 问题详情 明明put该有的文件在,可是怎么提示的是文件找不到的错误呢? 我就纳闷了put: `/home/bigdata/1.txt': No such file or dire ...