Java8 中的ParallelStream

目录
  • 1、Stream API
  • 2、ParallelStreams执行原理
  • 3、ParallelStreams注意事项

前言:

并行编程势不可挡,Java从1.7开始就提供了Fork/Join 支持并行处理。java1.8 进一步加强。

并行处理就是将任务拆分子任务,分发给多个处理器同时处理,之后合并。

1、Stream API

Java 8 引入了许多特性,Stream API是其中重要的一部分。区别 InputStream OutputStreamStream API 是处理对象流而不是字节流。

执行原理如下,流分串行和并行两种执行方式

// 串行执行流
stream().filter(e -> e > 10).count();
// 并行执行流
.parallelStream().filter(e -> e > 10).count()

2、ParallelStreams执行原理

并行执行时,java将流划分为多个子流,分散在不同CPU并行处理,然后进行合并。

并行一定比串行更快吗?这不一定,取决于两方面条件:

  • 处理器核心数量,并行处理核心数越多自然处理效率会更高。
  • 处理的数据量越大,优势越强。这也很好理解,比如十个人干一个人就能完成的活儿会比它自己干更便宜?

3、ParallelStreams注意事项

使用并行流时,不要使用collectors.groupingBy,collectors.toMap,替代为

collectors.groupingByConcurrent , collectors.toConcurrentMap,或直接使用串行流。

原因,并行流执行时,通过操作Key来合并多个map的操作比较昂贵。详细大家可以查看官网介绍。

https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html#concurrent_reduction

Map<String, List<Person>> byGender =
  roster
   .stream()
   .collect(Collectors.groupingBy(Person::getGender));

ConcurrentMap<String, List<Person>> byGender =
  roster
   .parallelStream()
   .collect(Collectors.groupingByConcurrent(Person::getGender));

ParallelStreams 默认使用 ForkJoinPool.commonPool()线程池。

注意:默认情况下,你写的 ParallelStreams 都是通过该线程池调度执行,整个应用程序都共享这个线程池。

看一个例子,我们查询一批新闻数据,可以利用并行化来处理远程新闻下载。

public List<News> queryNews(Stream<String> ids) {
     return ids.parallel()
            .map(this::getNews) // 网络操作,新闻下载
            .collect(toList());
}

因为是网络操作,存在很多不确定性,假如某个任务运行时间较长,导致线程池资源占据,阻塞其它线程,这样就阻止了其他的并行流任务正常进行。

如果解决这个问题的其中一种方式,进行线程池隔离。那么如何自定义并行流的线程池呢?

ForkJoinPool 构造参数我们默认设置为CPU核心数。

ForkJoinPool customThreadPool = new ForkJoinPool(4);
long actualTotal = customThreadPool
  .submit(() -> roster.parallelStream().reduce(0, Integer::sum)).get();

总结:

Java 1.8 提供的Stream API简化了代码,很好用。不过在使用过程中应该注意以上问题。

到此这篇关于Java8 中的并行流 ParallelStreams的文章就介绍到这了,更多相关Java8 ParallelStreams内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java8特性之用Stream流代替For循环操作详解

    目录 准备一个实体类 准备一个List集合 传统的for循环 使用Stream流 先声明筛选条件,在遍历 Stream操作 嵌套循环(2层) 准备一个实体类 public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int get

  • Java8中Stream的一些神操作

    Java8对集合提供了一种流式计算的方式,这种风格将要处理的元素集合看 作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如 筛选, 排序,聚合等. Stream API 基本都是返回Stream本身,这样多个操作可以串联成一个管 道, 如同流式风格(fluent style). 这样做可以对操作进行优化, 比 如延迟执行(laziness)和短路( short-circuiting) stream() 为集合创建串行流 parallelStream() 为集合创建并行流 pri

  • 一文带你掌握Java8强大的StreamAPI

    目录 Stream 概述 Stream 实例化 1.方式一:通过集合 2.方式二:通过数组 3.方式三:通过Stream的of() 4.方式四:创建无限流 Stream 中间操作 1.筛选与切片 2.映射 3.排序 Stream 终止操作 1.匹配与查找 2.归约 3.收集 Stream 概述 Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中.这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程

  • 用Java8 stream处理数据

    目录 1.stream处理数据介绍 2.Stream起步 3.Stream与Collection比较 1.stream处理数据介绍 如果没有集合Collection你如何处理数据?几乎所有的Java应用程序都要使用Collection处理数据.他们是十分重要的编程工作:例如,您可能想要创建银行交易的集合Collection,这个集合代表客户的状态.然后,你可能要处理整个集合来找出的顾客花了多少钱.尽管集合如此重要,但是在Java中处理集合的技术还远远不够完善. 首先,对集合的典型处理模式是类似S

  • Java实现InputStream的任意拷贝方式

    Java InputStream的任意拷贝 有时候,当我们需要多次使用到同一个InputStream的时候如何实现InputStream的拷贝使用 我们可以把InputStream首先转换成ByteArrayOutputStream.然后你就可以任意克隆你需要的InputStream了 代码如下: ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; w

  • Java BufferedOutputStream类的常用方法讲解

    目录 BufferedOutputStream类的常用方法 构造方式 常用方法 程序示例 BufferedOutputStream深入分析 代码准备 原因分析 手动刷盘 buffer源码分析 关于buf缓冲数据大小设置 BufferedOutputStream类的常用方法 BufferedOutputStream字节缓冲输出流 构造方式 第一种开发中 public BufferedOutputStream(OutputStream out) 采用的默认的缓冲区大小(足够大了) ,来构造一个字节缓

  • 通过实例解析java8中的parallelStream

    这篇文章主要介绍了通过实例解析java8中的parallelStream,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 about Stream 什么是流? Stream是java8中新增加的一个特性,被java猿统称为流. Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作:高级版本的 Stream

  • Java8 中的ParallelStream

    目录 1.Stream API 2.ParallelStreams执行原理 3.ParallelStreams注意事项 前言: 并行编程势不可挡,Java从1.7开始就提供了Fork/Join 支持并行处理.java1.8 进一步加强. 并行处理就是将任务拆分子任务,分发给多个处理器同时处理,之后合并. 1.Stream API Java 8 引入了许多特性,Stream API是其中重要的一部分.区别 InputStream OutputStream,Stream API 是处理对象流而不是字

  • 深入浅出Java8中parallelStream的使用

    about Stream 什么是流? Stream是java8中新增加的一个特性,被java猿统称为流. Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作:高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 "过滤掉长度大于 10 的字符串"."获取每个字符串的首字母"等,Stream 会隐式地在

  • Java8中的 Lambda表达式教程

     1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成λ表达式后是这个样子: (int x, int y) -> x + y; 参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返回两数之和 或者 (x, y) -> { return x + y; } //显式指明返回值 可见λ表达式有三部分组成:参数列表,箭头(-&g

  • java8中lamba表达式的使用

    (-1)前言 学习lamba表达式是十分重要的,你会发现java变的可爱多了. (0)函数式接口 只有一个方法的接口称为函数式接口 JButton jButton = new JButton("123"); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) {}}); 等同于 jButton.addActionListener(e-&

  • 初识Java8中的Stream

    lambda表达式是stream的基础,初学者建议先学习lambda表达式,http://www.jb51.net/article/121129.htm 1.初识stream 先来一个总纲: 东西就是这么多啦,stream是java8中加入的一个非常实用的功能,最初看时以为是io中的流(其实一点关系都没有),让我们先来看一个小例子感受一下: @Before public void init() { random = new Random(); stuList = new ArrayList<St

  • 总结一下关于在Java8中使用stream流踩过的一些坑

    Java8的stream流 第一个坑: Collectors.toAsList()其实是new了一个list,在向里面赋值. 注意这里Collectors.toList()的写法,这里其实是底层new ArraryList().筛选的数据放到一个新的list.虽然标1处和标2处是同一个变量,但是内存地址是不一样啊.下面的逻辑时把hldrPolVOList中的某些元素删除.但是这个方法执行完后其实是没有删除里面元素的.原因就是这里的new ArraryList()更改了内存地址造成的. 测试: 解

  • Java8中Stream的使用方式

    目录 前言: 1. 为什么有经验的老手更倾向于使用Stream 2. Stream 的使用方式 3. Stream 的创建 4. Stream 中间操作 5. Stream 终止操作 6. Stream 特性 前言: 相信有很多刚刚入坑程序员的小伙伴被一些代码搞的很头疼,这些代码让我们既感觉到很熟悉,又很陌生的感觉.我们很多刚入行的朋友更习惯于使用for循环或是迭代器去解决一些遍历的问题,但公司里很多老油子喜欢使用Java8新特性Stream流去做,这样可以用更短的代码实现需求,但是对于不熟悉的

  • Java8中的Stream 流实践操作

    目录 1 前言 2 Stream 的分类 3 Stream 的操作 3.1 创建流的方式 3.2 流的中间操作 3.3 流的终止操作 总结 1 前言 Stream 是 java8 中处理集合的抽象概念,可以执行非常复杂的查询.过滤和映射数据等操作.Stream API 提供了一种高效的处理数据方式,Stream 对集合数据的操作可以说是非常的方便.Stream 是流,不是一种数据结构,也不会保存数据,只是一种数据处理方式,从一种数据组织结构到另外一种数据结构. 2 Stream 的分类 按照 S

随机推荐