Stream和parallelStream

Stream和parallelStreamStream和parallelStreamParallelStreamstreamparallelstreamstream和parallelStream一.什么是Stream?Stream是在Java8新增的特性,普遍称其为流;它不是数据结构也不存放任何数据,其主要用于集合的逻辑处理。二.和Iterator的区别Iterator做为迭代器,其按照一定的顺序迭代遍历集合中的每一个元素,并且对每个元素进行指定的操作。

大家好,又见面了,我是你们的朋友全栈君。

Stream parallelStream

一.什么是Stream?

Stream 是在 Java8 新增的特性,普遍称其为流;它不是数据结构也不存放任何数据,其主要用于集合的逻辑处理。

二.和Iterator的区别

Iterator 做为迭代器,其按照一定的顺序迭代遍历集合中的每一个元素,并且对每个元素进行指定的操作。而 Stream 在此基础上还可以将这种操作并行化,利用多核处理器的优势快速处理集合(集合的数据会分成多个段,由多个线程处理)。

Stream 的数据源可以有无限多个。

三.Stream的使用

在使用Stream之前,建义先理解接口化编程,Stream将完全依赖于接口化编程方式。接下来我们以“打印集合中的每一个元素”为例,了解一下 Stream 的使用。

​ 例3.1

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

输出:1 2 3 4 5 6 7 8 9

由以上的列子可以看出,Stream 的遍历方式和结果与 Iterator 没什么差别,这是因为Stream的默认遍历是和迭代器相同的,保证以往使用迭代器的地方可以方便的改写为 Stream。

Stream 的强大之处在于其通过简单的链式编程,使得它可以方便地对遍历处理后的数据进行再处理。我们以“对集合中的数字加1,并转换成字符串”为例进行演示。

​ 例3.2

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);`

`List<String> strs = numbers.stream()`

`.map(num->Integer.toString(++num)).collect(Collectors.toList());

其中map()方法遍历处理每一个元素,并且返回一个新的Stream,随后collect方法将操作后的Stream解析为List。

Stream还提供了非常多的操作,如filter()过滤、skip()偏移等等,想要了解更多可以去翻阅JDK1.8手册或者相关资料。

四.并行流parallelStream

parallelStream提供了流的并行处理,它是Stream的另一重要特性,其底层使用Fork/Join框架实现。简单理解就是多线程异步任务的一种实现。

我们用例3.1中的示例演示一下parallelStream的使用。

​ 例4.1

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

输出:3 4 2 6 7 9 8 1 5

我们发现,使用parallelStream后,结果并不按照集合原有顺序输出。为了进一步证明该操作是并行的,我们打印出线程信息。

​ 例4.2

   List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 
   numbers.parallelStream() .forEach(num-
   		>System.out.println(Thread.currentThread().getName()+">>"+num)); 

输出:

main>>6 
ForkJoinPool.commonPool-worker-2>>8 
main>>5 ForkJoinPool.commonPool-worker-2>>9 
ForkJoinPool.commonPool-worker-1>>3 
ForkJoinPool.commonPool-worker-3>>2 
ForkJoinPool.commonPool-worker-1>>1 
ForkJoinPool.commonPool-worker-2>>7 
main>>4

通过例4.2可以确信parallelStream是利用多线程进行的,这可以很大程度简化我们使用并发操作。

我们可以通过虚拟机启动参数

-Djava.util.concurrent.ForkJoinPool.common.parallelism=N

来设置worker的数量。

五.并行流的陷阱

5.1.线程安全

由于并行流使用多线程,则一切线程安全问题都应该是需要考虑的问题,如:资源竞争、死锁、事务、可见性等等。

5.2.线程消费

在虚拟机启动时,我们指定了worker线程的数量,整个程序的生命周期都将使用这些工作线程;这必然存在任务生产和消费的问题,如果某个生产者生产了许多重量级的任务(耗时很长),那么其他任务毫无疑问将会没有工作线程可用;更可怕的事情是这些工作线程正在进行IO阻塞。

本应利用并行加速处理的业务,因为工作者不够反而会额外增加处理时间,使得系统性能在某一时刻大打折扣。而且这一类问题往往是很难排查的。我们并不知道一个重量级项目中的哪一个框架、哪一个模块在使用并行流。

接下来我们对这个问题进行演示:

​ 例5.1

定义两个并行流逻辑
执行两个并行流
输出:
并行流竞争输出结果

通过示例我们会发现,第一个并行流率先获得worker线程的使用权,第二个并行流变为串行;直到第14行,第一个并行流处理完毕,第二个并行流获取worker线程,开始并行处理。

小结:

串行流:适合存在线程安全问题、阻塞任务、重量级任务,以及需要使用同一事务的逻辑。

并行流:适合没有线程安全问题、较单纯的数据处理任务。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161782.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 领英群发消息技巧[通俗易懂]

    领英群发消息技巧[通俗易懂]使用Linkedin的人都有群发消息的需求,但Linkedin平台并没有提供群发功能。如果要群发的话,只能把所有好友拉到一个群里再发送。这样,所有的好友都可以在里面聊天,无法做到单独显示的效果。领英精灵注册试用网址:http://linkedinjl.com/r?i=SPSAMR那有没有一种方法,可以实现快速群发并单独显示的效果呢?答案是肯定的,下面就教大家一种方法,实现快速群发消息并单独显示的效果。操作步骤:1.首先需要准备好领英精灵工具,安装后,右侧会有工具操作界面2.再.

    2022年6月3日
    55
  • 一级域名和二级域名的区别是什么?作用怎样?

    一级域名和二级域名的区别是什么?作用怎样?

    2021年9月20日
    74
  • html 中 超链接的写法,网页超链接样式的CSS写法「建议收藏」

    html 中 超链接的写法,网页超链接样式的CSS写法「建议收藏」上一篇文章讲了母栏目后面两行子栏目的DIV布局,这篇文章讲导航做完之后我想在鼠标移到每个不同区域的超链接在颜色上给予变化。上图所示上上一篇文章的大概样式,颜色就不一一举例了,我现在现在是给了“男士”“女士”“养生”三个母栏目不同的颜色,为了好看一点,我想鼠标移动到“男士”后面的子栏目上面的颜色和“男士”的字体颜色一样,移到“女士”其后面的子栏目的超链接与“女士”的超链接颜色一样,“养生”同样的。先…

    2022年7月19日
    14
  • Springboot整合shiro_spring boot框架介绍

    Springboot整合shiro_spring boot框架介绍Shiro介绍Shiro是一款安全框架,主要的三个类Subject、SecurityManager、RealmSubject:表示当前用户SecurityManager:安全管理器,即所有与安全有关的操作都会与SecurityManager交互;且其管理着所有Subject;可以看出它是Shiro的核心,它负责与Shiro的其他组件进行交互,它相当于SpringMVC中DispatcherServlet的角色Realm:Shiro从Realm获取安全数据(如用户、角色、权限)Shiro

    2025年9月2日
    5
  • C#简单串口调试助手【傻瓜教程】chanson_chapter01[通俗易懂]

    C#简单串口调试助手【傻瓜教程】chanson_chapter01[通俗易懂]简易串口调试助手制作教程【C#.Winform】chanson_chapter01[说明]:本教程基于win10x64位操作系统,软件环境为MicrosoftVisualStudioCommunity2015(以下简称VS)(新建工程文件)【1】打开VS,[文件]–>[新建]–>[项目],弹出窗体如下:(布局方法)【2】开始布局

    2022年5月10日
    40
  • 深度神经网络总结

    深度神经网络总结深度神经网络(DeepNeuralNetworks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layerperceptron,MLP)。1前向传播算法1.1从感知机到神经网络感知机的模型是一个有若干输入和一个输出的模型,如下图:输出和输入之间学习到一个线性关系,得到中间输出结果:接着是一个神经元激活函数,…

    2022年6月15日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号