java fork/join简单实践
我们知道,java8中有并行流,而并行流在后台的实现是通过fork/join池来完成的,例如:
List<Integer> a = buildList();
List<Integer> b = buildList();
a.parallelStream().foreach(System.out::println);
b.parallelStream().foreach(System.out::println);
如果查看线程dump会发现,这两个并行流公用的是同一套线程池,.这在I/O密集型任务中会是个问题,应为两个并行流会因阻塞而有不必要的等待.在查阅相关文章之后,发现可以通过java中的fork/join框架来改良.这里简单介绍一下:
要用fork/join框架需要继承RecursiveTask类或者RecursiveAction,这两个的区别是一个有返回值,一个没有返回值,按字面上的意思就是递归任务.
这类task有fork()方法,就是拆分任务,还有一个join方法,合并任务.
这些task放到ForkJoinPool中执行.ForkJoinPool可以指定线程池大小.
想到fork/join思想其实就是分治的思想,又和归并排序的思想一致,就写了一个用fork/join框架实现的归并排序,供大家参考使用:
package com.wl.test2; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.RecursiveTask; /**
* Created by wally on 9/14/17.
*/
public class MergeSortByRecursiveTask extends RecursiveTask<List<Integer>> { private int start; private int end; private List<Integer> numbers; public MergeSortByRecursiveTask(int start, int end, List<Integer> numbers) {
this.start = start;
this.end = end;
this.numbers = numbers;
} @Override
protected List<Integer> compute() {
if (start == end) {
return numbers;
}
int mid = (start + end) / 2;
int aa = mid+1;
MergeSortByRecursiveTask mergeSortByRecursiveTask = new MergeSortByRecursiveTask(start, mid, numbers);
MergeSortByRecursiveTask mergeSortByRecursiveTask1 = new MergeSortByRecursiveTask(aa, end, numbers); mergeSortByRecursiveTask.fork();
mergeSortByRecursiveTask1.fork(); mergeSortByRecursiveTask.join();
mergeSortByRecursiveTask1.join(); merge();
return numbers;
} private void merge() { List<Integer> newNumbers = new ArrayList<>(numbers);
int mid = (end + start) / 2; int tempMid = mid + 1;
int i = start;
int k = start;
int m = start;
while (m <= mid && tempMid <= end) {
if (numbers.get(m) <= numbers.get(tempMid)) {
newNumbers.set(k, numbers.get(m));
m++;
}else{
if(tempMid==2){
System.out.println("here");
}
newNumbers.set(k,numbers.get(tempMid));
tempMid++;
}
k++;
} while(m<=mid){
newNumbers.set(k,numbers.get(m));
m++;
k++;
}
while(tempMid<=end){
newNumbers.set(k,numbers.get(tempMid));
tempMid++;
k++;
}
System.out.println("start is :"+ start+", mid is " + mid+ ", end is " + end);
while(i<=end){ numbers.set(i,newNumbers.get(i));
System.out.print(newNumbers.get(i)+",");
i++;
}
System.out.println(";");
System.out.println(Thread.currentThread().getName()); }
}
main函数:
package com.wl.test2; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*; /**
* Created by wally on 3/27/17.
*/
public class TestDIr { private static boolean a = true; public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InterruptedException {
List<Integer> temp = new ArrayList<>();
temp.add(3);
temp.add(9);
temp.add(4);
temp.add(3);
temp.add(1);
temp.add(8);
temp.add(5);
List<Integer> result = new ArrayList<>(temp);
MergeSortByRecursiveTask mergeSortByRecursiveTask = new
MergeSortByRecursiveTask(0,temp.size()-1,temp);
ForkJoinPool pool = new ForkJoinPool();
Future<List<Integer>> sortResult = pool.submit(mergeSortByRecursiveTask); try{
System.out.println(Arrays.toString(sortResult.get().toArray())); } catch (ExecutionException e) {
e.printStackTrace();
} }
}
输出结果:
start is :4, mid is 4, end is 5
1,8,;
ForkJoinPool-1-worker-3
start is :4, mid is 5, end is 6
1,5,8,;
ForkJoinPool-1-worker-3
start is :0, mid is 0, end is 1
3,9,;
ForkJoinPool-1-worker-2
start is :2, mid is 2, end is 3
3,4,;
ForkJoinPool-1-worker-2
here
start is :0, mid is 1, end is 3
3,3,4,9,;
ForkJoinPool-1-worker-2
start is :0, mid is 3, end is 6
1,3,3,4,5,8,9,;
ForkJoinPool-1-worker-1
[1, 3, 3, 4, 5, 8, 9]
最后推荐几篇文章:
http://www.infoq.com/cn/articles/fork-join-introduction
http://www.importnew.com/16801.html
java fork/join简单实践的更多相关文章
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- Java Fork/Join 框架
简介 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果. 这种思想和MapReduce很像 ...
- Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)
作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...
- java Fork/Join框架
应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...
- JAVA FORK JOIN EXAMPLE--转
http://www.javacreed.com/java-fork-join-example/ Java 7 introduced a new type of ExecutorService (Ja ...
- Java Fork/Join
Fork/Join框架 Fork/Join 以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果. 这个过程其实就是分治算法的并行版本,图解如下: 如何使用 我们要使 ...
- Java fork join ForkJoinPool 用法例子
本例是把一个大的数组求和的计算的大任务分解到在小范围内求和的小任务,然后把这些小任务之和加起来就是所求之结果. 技术:JDK8.0, Javafork-join模式下的RecursiveTask技术, ...
- 【转】Java 异步处理简单实践
同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理. 异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间 ...
- Java并发——Fork/Join框架
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
随机推荐
- docker save和load将本地镜像上传AWS
今天在AWS云主机上部署Grafana,发现无法使用私有仓库,于是,尝试了下docker save和docker load.着实很好用,简单记录下: docker save用法: Usage: doc ...
- 2019年后,Java岗面试快速突击指南
大家好.这篇文章给大家分享一下如何获得一个可以去参加面试的最小可行知识(Minimal Viable Knowledge)!我自己在就基本上靠文章中的策略在找实习的时候拿到了头条阿里的offer.所以 ...
- 图解Python网络编程
返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...
- Mysql8以上需要指定时区serverTimezone
JDBC连接Mysql8以下 com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...
- MVC06
1.校验机制 我们可以在Model中使用属性进行校验 using System; using System.ComponentModel.DataAnnotations; using System.D ...
- MySQL中SQL Mode的查看与设置
MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql_mode 的值.本文主要介绍一下这个值的查看与设置,主要在Mac系统下. 对于每个模式的意义和作用 ...
- [android]从书中编码方式,看编程思想
<Android权威编程指南第3版>今天学习到第10章,感叹经验丰富的编程理念——解耦合. 编程理念肯定是尽可能解除耦合,让代码可以复用,书中多次提到关于参数传递的解耦,这又出现一次. 本 ...
- .tar.xz文件的创建和解压
创建tar.xz文件:只要先 tar cvf xxx.tar xxx/ 这样创建xxx.tar文件先,然后使用 xz -z xxx.tar 来将 xxx.tar压缩成为 xxx.tar.xz 解压ta ...
- Python3 + requests + unittest接口测试
一.缘 起 笔者最近完成了基于Python3 + requests + unittest的接口测试脚本,故在此做一下记录,于己为复盘,于彼为学习和参考 二.思 路 接口测试无非三步: 首先,造数据 - ...
- iOS/macOS推荐个高效苹果开发工具, JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,支持Swift/Objective-C,极速转换
CCJSON 是一款运行在macOS上 JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,可识别嵌套模型,字典/数组,支持Swift/Objective-C,操作方便,极速转换.下载 效果 ...