Java8的Stream()与ParallelStream()的区别说明

Java8 Stream()与ParallelStream()区别

Stream

无状态:指元素的处理不受之前元素的影响;

有状态:指该操作只有拿到所有元素之后才能继续下去。

非短路操作:指必须处理所有元素才能得到最终结果;

短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。

ParallelStream

对于ParallelStream,需要知道的是里面的执行是异步的,并且使用的线程池是ForkJoinPool.common,可以通过设置-Djava.util.concurrent.ForkJoinPool.common.parallelism = N来调整线程池的大小;

ParallelStream的作用

Stream具有平行处理能力,处理的过程会分而治之,也就是将一个大任务切分成多个小任务,这表示每个任务都是一个操作,因此像以下的程式片段:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); numbers.parallelStream().forEach(System.out::println);

得到的展示顺序不一定会是1、2、3、4、5、6、7、8、9,而可能是任意的顺序。得到的结论就是parallelStream()每次执行的结果都不相同,与多线程程序中执行的结果类似。如果希望最后顺序是按照原来Stream的数据顺序,那可以调用forEachOrdered()。

例如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); numbers.parallelStream().forEachOrdered(System.out::println);

你得到的展示顺序就是1、2、3、4、5、6、7、8、9。

Java8并行流parallelStream()和stream()的区别就是支持并行执行,提高程序运行效率。但是如果使用不当可能会发生线程安全的问题。

其他同类知识点:

1、Java集合Stream类filter的使用;

2、Java中的排序问题(Java8新特性 stream流、stream多字段排序);

parallelStream与stream效率比较

结论

parallel线程不安全

parallel的效率,因为是多线程,默认线程数量是计算器处理器的数量

代码

public class StreamTest {    @Test    public void streamVs(){        List<Integer> list1 = new ArrayList<>(10000);        List<Integer> list2 = new ArrayList<>(10000);        List<Integer> list3 = new ArrayList<>(10000);        Lock lock = new ReentrantLock();        IntStream.range(0, 10000).forEach(list1::add);        IntStream.range(0, 10000).parallel().forEach(list2::add);        IntStream.range(0, 10000).parallel().forEach(i -> {            lock.lock();            try {                list3.add(i);            }finally {                lock.unlock();            }        });        System.out.println("串行执行的大小:" + list1.size());        System.out.println("并行执行的大小:" + list2.size());        System.out.println("加锁并行执行的大小:" + list3.size());    }    @Test    public void streamVs2(){        List<Person> persons = constructPersons();        doFor(persons);        doStream(persons);        doParallelStream(persons);    }    /**     * 构造数据     *     * @return     */    public List<Person> constructPersons() {        List<Person> persons = new ArrayList<Person>();        for (int i = 0; i < 5; i++) {            Person p = new Person(i, "name" + i, "sex" + i, i);            persons.add(p);        }        return persons;    }    /**     * for     *     * @param persons     */    public void doFor(List<Person> persons) {        long start = System.currentTimeMillis();        for (Person p : persons) {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {            }            //System.out.println(p.name);        }        long end = System.currentTimeMillis();        System.out.println("doFor cost:" + (end - start));    }    /**     * 顺序流     *     * @param persons     */    public void doStream(List<Person> persons) {        long start = System.currentTimeMillis();        persons.stream().forEach(x -> {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {            }            //System.out.println(x.name);        });        long end = System.currentTimeMillis();        System.out.println("doStream cost:" + (end - start));    }    /**     * 并行流     *     * @param persons     */    public void doParallelStream(List<Person> persons) {        long start = System.currentTimeMillis();        persons.parallelStream().forEach(x -> {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {            }            //System.out.println(x.name);        });        long end = System.currentTimeMillis();        System.out.println("doParallelStream cost:" + (end - start));    }}class Person {    int    id;    String name;    String sex;    float  height;    public Person(int id, String name, String sex, float height) {        this.id = id;        this.name = name;        this.sex = sex;        this.height = height;    }}

测试截图

串行执行的大小:10000

并行执行的大小:7219

加锁并行执行的大小:10000

doFor cost:5012doStream cost:5073doParallelStream cost:2013

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于Java8 parallelStream并发安全的深入讲解

    背景 Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream. 在爬虫开发过程中,经常会遇到遍历一个很大的集合做重复的操作,这时候如果使用串行执行会相当耗时,因此一般会采用多线程来提速.Java8的paralleStream用fork/join框架提供了并发执行能力.但是如果使用不当,很容易陷入误区. Java8的paralleStream是线程安全的吗 一个简单的例子,

  • 深入浅出Java8中parallelStream的使用

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

  • 通过实例解析java8中的parallelStream

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

  • java8中parallelStream性能测试及结果分析

    测试1 @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @Warmup(iterations = 5, time = 3, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 20, time = 3, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Benchmark) public cla

  • Java8的Stream()与ParallelStream()的区别说明

    Java8 Stream()与ParallelStream()区别 Stream 无状态:指元素的处理不受之前元素的影响: 有状态:指该操作只有拿到所有元素之后才能继续下去. 非短路操作:指必须处理所有元素才能得到最终结果: 短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果. ParallelStream 对于ParallelStream,需要知道的是里面的执行是异步的,并且使用的线程池是ForkJoinPool.common,可以通过

  • Java8之Stream流代替For循环操作

    Stream流代替For循环进行输出可以使代码更简洁. 需求:根据姓名获取员工信息 1.建立实体类:Emp public class Emp { private String id; private String name; public Emp(String id, String name) { this.id=id; this.name=name; } public String getId() { return id; } public void setId(String id) { th

  • 关于JAVA8的 Stream学习

    目录 一.Stream的使用 1.1 创建 1.2 步骤 二.Stream的特性 三.中间操作 3.1 filter() 3.2 limit() 3.3 skip() 3.4 map() 3.5 sorted 四.终止操作 4.1 allMatch 4.2anyMatch 4.3noneMatch 4.4 findFirst() 4.5 findAny() 4.6 count 4.7 max 4.8 min 4.9 forEach 4.10 reduce 4.11 collect 一.Strea

  • Java8中Stream的一些神操作

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

  • Java8中Stream流式操作指南之入门篇

    目录 简介 正文 1. 流是什么 2. 老板,上栗子 3. 流的操作步骤 4. 流的特点 5. 流式操作和集合操作的区别: 总结 简介 流式操作也叫做函数式操作,是Java8新出的功能 流式操作主要用来处理数据(比如集合),就像泛型也大多用在集合中一样(看来集合这个小东西还是很关键的啊,哪哪都有它) 下面我们主要用例子来介绍下,流的基操(建议先看下lambda表达式篇,里面介绍的lambda表达式.函数式接口.方法引用等,下面会用到) 正文 1. 流是什么 流是一种以声明性的方式来处理数据的AP

  • Java8中Stream的使用方式

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

  • Java8中Stream的详细使用方法大全

    目录 一.概述 1.使用流的好处 2.流是什么? 二.分类 三.Stream的创建 1.通过 java.util.Collection.stream() 方法用集合创建流 2.使用 java.util.Arrays.stream(T[]array)方法用数组创建流 3.使用 Stream的静态方法:of().iterate().generate() 四.Stream API简介 1.遍历/匹配(foreach/find/match) 2.按条件匹配filter 3.聚合max.min.count

  • Java8中stream和functional interface的配合使用详解

    前言 Java 8 提供了一组称为 stream 的 API,用于处理可遍历的流式数据.stream API 的设计,充分融合了函数式编程的理念,极大简化了代码量. 大家其实可以把Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作:高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如"过滤掉长度大于10的字符串"."获取每个字符串的首字母"等,具体这些操作如何应用到每个元素上,

  • java8中Stream的使用以及分割list案例

    一.Steam的优势 java8中Stream配合Lambda表达式极大提高了编程效率,代码简洁易懂(可能刚接触的人会觉得晦涩难懂),不需要写传统的多线程代码就能写出高性能的并发程序 二.项目中遇到的问题 由于微信接口限制,每次导入code只能100个,所以需要分割list.但是由于code数量可能很大,这样执行效率就会很低. 1.首先想到是用多线程写传统并行程序,但是博主不是很熟练,写出代码可能会出现不可预料的结果,容易出错也难以维护. 2.然后就想到Steam中的parallel,能提高性能

  • Java8 使用 stream().sorted()对List集合进行排序的操作

    1.声明一个测试对象 import java.time.LocalDate; import java.util.List; import lombok.Data; @Data public class StudentInfo{ //名称 private String name; //性别 true男 false女 private Boolean gender; //年龄 private Integer age; //身高 private Double height; //出生日期 private

随机推荐