文档章节

Java Stream API(五)-- 并行数据处理

兴趣使然的程序员
 兴趣使然的程序员
发布于 2017/04/25 17:12
字数 769
阅读 31
收藏 1

Java 8用Stream API(java.util.stream)解决了这两个问题:集合处理时的套路和晦涩,以及难以利用多核。

之前的博客介绍了如何进行单线程的集合处理,这里介绍如何使用Stream API进行透明的并行处理。Stream API允许声明性地将顺序流变为并行流,而不需要考虑具体实现

1、并行流

并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流。流转化的方法:

  1. parallel()方法把流转化为并行流
  2. sequential()方法把并行流转化为顺序流

例如使用stream计算:接受数字n作为参数,并返回从1到给定参数的所有数字的和。

//顺序流版本
public static long getSequentialSum(Long n){
    return LongStream.rangeClosed(0, n)
            .reduce(0L, Long::sum);
}
//并行流版本
public static long getParallelSum(Long n){
    return LongStream.rangeClosed(0,n)
            .parallel()
            .reduce(0L,Long::sum);
}

需要注意的是:

  1. 顺序流版本的效率普遍来说可能比直接使用foreach编写要慢,因为foreach更加底层
  2. 在这个例子中,并行流版本的运行效率多数情况下会比foreach更好,但是不是所有的并行流版本都会更快
  3. 如果不使用rangeClosed方法产生数字,而用iterate方法,很可能导致并行计算比顺序计算更慢的情况,这是因为iterate生产数字,整张数字列表在reduce操作开始时并没有准备好,没法有效地对数据进行分块

2、正确地使用并行流

和其他的所有并行算法相同,使用并行流同样可能导致错误。而错用并行流产生错误的首要原因,就是使用的算法改变了某些共享状态(和其他并行处理过程一样,共享状态通常是类的实例变量或者静态变量,或者方法块之外的变量,方法块内部的局部变量通常是安全的)。

为了正确地使用并行流进行数据处理,记得要避免共享可变状态

3、高效地使用并行流

要高效地使用并行流需要注意以下几点:

  1. 并行流并不总是比顺序流要快,并且有时候虽然直觉认为更快,实际上却可能更慢
  2. 依赖前后顺序的操作(比如limit和findFirst方法),使用并行流会比顺序流更慢
  3. 如果数据量较小,使用并行流并没有意义,并行处理的好处可能还抵不上并行化造成的额外开销
  4. 还要考虑最后的合并步骤的代价大小
  5. 不同的数据源结构很可能导致不同的并行效率,这是因为不同的数据结构的划分代价不同,下面是常见的数据源和其可分解性:
可分解性
ArrayList 极佳
LinkedList
IntStream.range 极佳
Stream.iterate
HashSet
TreeSet


 

© 著作权归作者所有

兴趣使然的程序员
粉丝 23
博文 112
码字总数 87412
作品 0
深圳
程序员
私信 提问
第一章 为什么要关心java8

一、java怎么还在变 1、java在编程语言生态系统中的位置 java虚拟机(JVM)及其字节码可能会变得比java语言本身更重要,而且对于某些应用来说,java可能会被同样运行在JVM上的竞争对手(如S...

一个yuanbeth
2018/09/25
0
0
Java 8 Stream的性能到底如何?

已经对Stream API的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?本节我们对Stream API的性能一探究竟。 为保证测试结果真实可信,我们将JVM运行在模式下,测...

HollisChuang's Blog
03/16
0
0
Java 8新增特性优缺点

Java 8于今年三月份正式发布了。那么它是否如我们之前所期待的那样呢?下面我们就一一查看Java8新增特性的优缺点吧。 Java 8试图“创新”,根据 微软对这个词的定义,就是把其他框架或语言里...

Emilypz
2015/09/25
662
1
Java 8新特性探究(三)解开lambda最强作用的神秘面纱

我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值。现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析...

OSC闲人
2013/11/18
0
42
Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。 为什么说是长期版本,看下面的官方发布的支持路线图表。 可以看出 Java 8 扩展支持到 2025 年,...

Java技术栈
2018/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
0
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
3
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
2
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
2
0
今天的学习

今天学到了<select></select>标签: <label for="unittype">Select unit type: </label><select id="unittype" name="unittype" autofocus > <option value="1"> Miner </option> ......

墨冥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部