Fork/Jion框架可以干什么

如果你要处理1万条数据,但是你的能力暂时还不够,一个简单快捷的办法就是你可以把每次只处理100条,等到处理100次之后再把所有的结果聚合起来你就处理完了这1万条数据。

Fork/Join就是是Java7提供的原生多线程并行处理框架,它的基本思想就是将大任务分割成小任务,最后将小任务聚合起来得到结果。


如何使用Fork/Jion框架

我们要使用ForkJoin框架,首先要创建一个ForkJoin任务。它提供在任务中执行fork()和join的操作机制。
fork用来创建子线程,可以让程序多一个执行分枝,jion在我们之前文章中已经提到了,那就是等待结果。
通常我们可以按需继承如下两个类来使用Fork/Jion框架:

  1. RecursiveAction,用于没有返回结果的任务

  2. RecursiveTask,用于有返回值的任务


代码示例

下方是一个使用Fork/Jion框架计算1到10000的所有数值的和的一个简单的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class ForkJionDemo extends RecursiveTask<Integer> {
//任务拆分阈值
public static final int threshold = 100;
//计算起始值
private int start;
//计算结束值
private int end; public ForkJionDemo(int start, int end) {
this.start = start;
this.end = end;
} @Override
protected Integer compute() {
int sum = 0;
//计算任务是否需要拆分
boolean canCompute = (end - start) <= threshold;
if (canCompute) {
//无需拆分则执行任务累计
for (int i = start; i <= end; i++) {
sum += i;
}
} else {
List<ForkJionDemo> forkJionDemoList=new ArrayList<>();
//将任务拆分成100份
for(int i=0;i<100;i++){
//计算这个一份任务要计算的起点和终点,如果终点大于最大值则使用最大值为终点
int last=(start+threshold)>end?end:(start+threshold);
ForkJionDemo forkJionDemo = new ForkJionDemo(start, last);
//下一份任务的起点要更新
start+=threshold+1;
forkJionDemoList.add(forkJionDemo);
//提交子任务
forkJionDemo.fork();
}
//汇总拆分完毕后的任务结果
for(ForkJionDemo forkJionDemo:forkJionDemoList){
sum += forkJionDemo.join();
}
}
return sum;
} public static void main(String[] args) {
//构造一个任务线程池
ForkJoinPool forkjoinPool = new ForkJoinPool();
//创建一个计算1到10000之间所有数的和的任务
ForkJionDemo forkJionDemo = new ForkJionDemo(1, 10000);
//将任务提交到任务线程池
Future<Integer> result = forkjoinPool.submit(forkJionDemo);
try {
//打印最后计算结果
System.out.println(result.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}


使用Fork/Jion框架需要注意的点

如果使用Fork/Jion框架计算的任务量特别庞大时很可能会出现以下2种情况:
fork的线程越来越多导致性能严重下降
函数调用层次越来越深导致栈溢出

本文所有源码参见:https://github.com/shiyujun/syj-study-demo

博客所有文章首发于公众号《Java学习录》转载请保留
扫码关注公众号即可领取2000GJava学习资源


Fork/Jion框架可以干什么

如果你要处理1万条数据,但是你的能力暂时还不够,一个简单快捷的办法就是你可以把每次只处理100条,等到处理100次之后再把所有的结果聚合起来你就处理完了这1万条数据。

Fork/Join就是是Java7提供的原生多线程并行处理框架,它的基本思想就是将大任务分割成小任务,最后将小任务聚合起来得到结果。


如何使用Fork/Jion框架

我们要使用ForkJoin框架,首先要创建一个ForkJoin任务。它提供在任务中执行fork()和join的操作机制。
fork用来创建子线程,可以让程序多一个执行分枝,jion在我们之前文章中已经提到了,那就是等待结果。
通常我们可以按需继承如下两个类来使用Fork/Jion框架:

  1. RecursiveAction,用于没有返回结果的任务

  2. RecursiveTask,用于有返回值的任务


代码示例

下方是一个使用Fork/Jion框架计算1到10000的所有数值的和的一个简单的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class ForkJionDemo extends RecursiveTask<Integer> {
//任务拆分阈值
public static final int threshold = 100;
//计算起始值
private int start;
//计算结束值
private int end; public ForkJionDemo(int start, int end) {
this.start = start;
this.end = end;
} @Override
protected Integer compute() {
int sum = 0;
//计算任务是否需要拆分
boolean canCompute = (end - start) <= threshold;
if (canCompute) {
//无需拆分则执行任务累计
for (int i = start; i <= end; i++) {
sum += i;
}
} else {
List<ForkJionDemo> forkJionDemoList=new ArrayList<>();
//将任务拆分成100份
for(int i=0;i<100;i++){
//计算这个一份任务要计算的起点和终点,如果终点大于最大值则使用最大值为终点
int last=(start+threshold)>end?end:(start+threshold);
ForkJionDemo forkJionDemo = new ForkJionDemo(start, last);
//下一份任务的起点要更新
start+=threshold+1;
forkJionDemoList.add(forkJionDemo);
//提交子任务
forkJionDemo.fork();
}
//汇总拆分完毕后的任务结果
for(ForkJionDemo forkJionDemo:forkJionDemoList){
sum += forkJionDemo.join();
}
}
return sum;
} public static void main(String[] args) {
//构造一个任务线程池
ForkJoinPool forkjoinPool = new ForkJoinPool();
//创建一个计算1到10000之间所有数的和的任务
ForkJionDemo forkJionDemo = new ForkJionDemo(1, 10000);
//将任务提交到任务线程池
Future<Integer> result = forkjoinPool.submit(forkJionDemo);
try {
//打印最后计算结果
System.out.println(result.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}


使用Fork/Jion框架需要注意的点

如果使用Fork/Jion框架计算的任务量特别庞大时很可能会出现以下2种情况:
fork的线程越来越多导致性能严重下降
函数调用层次越来越深导致栈溢出

本文所有源码参见:https://github.com/shiyujun/syj-study-demo


Fork/Jion框架详解的更多相关文章

  1. Fork/Join框架详解

    Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork/Join框架要完成两件事情: 1.任务分 ...

  2. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  3. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

  4. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  5. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...

  6. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  7. Quartz.NET作业调度框架详解

    Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html

  8. mapreduce框架详解

    hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感 ...

  9. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

随机推荐

  1. python 产生token及token验证

    1.前言 最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击.在经过再三思考之后,自己试着实现一个产生token和验证tok ...

  2. Kafka元数据缓存(metadata cache)

    经常有人问的一个问题就是:Kafka broker到底是不是无状态的?网上有这样的说法: 正常情况下consumer会在消费完一条消息后线性增加这个offset.当然,consumer也可将offse ...

  3. 【BZOJ 2673】[Wf2011]Chips Challenge

    题目大意: 传送门 $n*n$的棋盘,有一些位置可以放棋子,有一些已经放了棋子,有一些什么都没有,也不能放,要求放置以后满足:第i行和第i列的棋子数相同,同时每行的棋子数占总数比例小于$\frac{A ...

  4. Charles模拟网络请求页面的网络超时测试

    正常情况下网络连接超时可能的原因有以下几点: 1.网络断开,手动的关掉了网络的连接 2.网络阻塞,导致你不能在程序默认等待时间内得到回复数据包. 3.网络不稳定,网络无法完整传送服务器信息. 4.系统 ...

  5. 离线安装mysql数据库

    开源数据库mysql,目前使用很广泛.作为程序员开发项目时,与关系型数据库打交道最多的估计也是mysql了.那么本文首先讲解如何离线安装mysql数据库,毕竟有很多项目部署在内网. 1.离线安装 本人 ...

  6. 干货,一文带你超详细了解 Filter 的原理及应用

    提出问题 1.我们在访问后台很多页面时都需要登录,只有登录的用户才能查看这些页面,我们需要   在每次请求的时候都检查用户是否登陆,这样做很麻烦,有没有一种方法可以在我们请求之   前就帮我们做这些事 ...

  7. 分布式团队中沟通引发的问题, itest 解决之道

    导读: 从问题场景和 itest 优雅解决办法及示例2部分来阐述 1.问题场景: 研发团队是分散在几地的分布式团队,经常会因沟通引来一些问题.如下三图是开发觉得测试进度太慢,一番对话之后, 接下来他们 ...

  8. Haskell学习-高阶函数

    原文地址:Haskell学习-高阶函数 高阶函数(higher-order function)就是指可以操作函数的函数,即函数可以作为参数,也可以作为返回结果.有了这两个特性,haskell可以实现许 ...

  9. Java语言编程 - Java历史简介

    1.1 Sun公司 介绍Java的历史之前,先介绍一下Java语言的缔造公司,Sun公司,Sun公司的全称是:Stanford University Network.值得一提的是,Sun公司从1982 ...

  10. 深入javascript的主流的模块规范

    文章首发于sau交流学习社区 一.前言 目前主流的模块规范: 1.UMD通用模块 2.CommonJs 3.es6 module 二.UMD模块(通用模块) (function (global, fa ...