我们知道,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简单实践的更多相关文章

  1. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  2. Java Fork/Join 框架

    简介 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果. 这种思想和MapReduce很像 ...

  3. Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)

    作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...

  4. java Fork/Join框架

    应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...

  5. JAVA FORK JOIN EXAMPLE--转

    http://www.javacreed.com/java-fork-join-example/ Java 7 introduced a new type of ExecutorService (Ja ...

  6. Java Fork/Join

    Fork/Join框架 Fork/Join 以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果. 这个过程其实就是分治算法的并行版本,图解如下: 如何使用 我们要使 ...

  7. Java fork join ForkJoinPool 用法例子

    本例是把一个大的数组求和的计算的大任务分解到在小范围内求和的小任务,然后把这些小任务之和加起来就是所求之结果. 技术:JDK8.0, Javafork-join模式下的RecursiveTask技术, ...

  8. 【转】Java 异步处理简单实践

    同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理. 异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间 ...

  9. Java并发——Fork/Join框架

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

随机推荐

  1. python webp转jpg

    webp格式转jpg格式 从网页上保存下来的webp格式的图片用ps和一些看图软件打不开,所以需要进行下转换. 直接上py代码.代码用到了PIL库,如果电脑上没有还需要pip install Pill ...

  2. Ado.net 02

    1.连接字符串不同,连接池也不同 SqlConnection对象只能被打开一次.但是在Close()后再进行Open()操作.但是在Dispose()之后就不能再Open()了. 2.SqlDataA ...

  3. Centos7 U盘安装

    以下内容来自 https://www.cnblogs.com/Hello-java/p/8628917.html 和 https://blog.csdn.net/fiiber/article/deta ...

  4. 记录:更新VS2019后单元测试运行卡住无法运行测试的问题。

    先说一下是如何遇到这个问题的 今天更新了Visual Studio到最新的版本,然后在运行之前建立的单元测试项目的时候一直卡住,过了一会儿以后提示 未能协商协议,等待响应在 90 秒后超时.出现此问题 ...

  5. HDFS DataNode详解

    1. datanode介绍 1.1 datanode datanode是负责当前节点上的数据的管理,具体目录内容是在初始阶段自动创建的,保存的文件夹位置由配置选项{dfs.data.dir}决定 1. ...

  6. 有了这套微信小程序x5调试,调试一些简单的开发者工具调试不了的功能不成问题!!!!

    1.首先我们需要打开微信 TBS 调试 地址是:http://debugx5.qq.com 2.然后打开手机 打开开发者模式,打开 USB 调试 3.然后 在谷歌浏览器地址栏输入 chrome://i ...

  7. 【猫狗数据集】使用top1和top5准确率衡量模型

    数据集下载地址: 链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw提取码:2xq4 创建数据集:https://www.cnblogs.com/xi ...

  8. 【opencv系列01】OpenCV4.X介绍与安装

    一.介绍 OpenCV(开源计算机视觉库:http://opencv.org)是英特尔开源的一个跨平台计算机视觉的BSD许可库,包含数百种计算机视觉算法.OpenCV由Gary Bradsky于199 ...

  9. Java14来了!Switch竟如此简单?Lombok也不需要了?来使用Idea配置Java14的开发环境吧!

    Java 14 在 2020.3.17 日发布正式版了,但现在很多公司还在使用 Java 7 或 Java 8,每当看到 Java 又发布新版本心里就慌得一匹.不过此版本并不是 LTS (长期支持版) ...

  10. 150多个Flutter组件详细介绍送给你

    迷茫是什么,迷茫就是大事干不了,小事不想干,能力配不上欲望,才华配不上梦想. 150+Flutter组件详细介绍地址:http://laomengit.com/ 前言 我在Flutter未正式发布之前 ...