parallelStream并行流性能

JDK8 parallelStream并行流异常时是如何管理异常的 1.测试进程与测试结果 package com.example.demo.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; import java.util.Random; /** * <p> * Description: TODO * </p> * * @author majun * @ve 阅读详情

背景

通过stream可以将一个普通的list,转化为流,然后就可以使用类似于管道的方式对list进行操作,假如我们把stream换成parallelStream 根据字面上的意思,流会从串行 变成并行;既然是并行,就知道这里面肯定会有线程安全问题,通过创建线程安全的List、Set,Map即可解决。

今天要说的一个问题,是parallelStream并行流性能的问题。我们在使用了parallelStream并行处理的时候,发现并没有按照预期缩短批量任务执行的时间。于是开始深入排查问题根源。

场景复现

下面的代码,我们模拟还原了场景,开启了10个线程,这10个线程都在使用并行流进行数据计算。在执行的逻辑中,我们让每个任务都sleep 1秒钟,这样就能够模拟一些I/O请求的耗时等待。

使用stream,程序会在20秒后返回,但我们期望程序能够在1秒多返回,因为它是并行流,但是通过测试发现,我们等了好久,任务才执行完毕。

原因分析

在不同的机器上执行,这段代码花费的时间都不一样。既然是并行,那肯定得有个并行度。太低了,体现不到并行的能能力; 太大了,又浪费了上下文切换的时间。可以想象一下如果在I/O密集型业务中用上parallelStream 会造成什么后果,所以要了解这个并行度,我们需要查看具体的构造方法。

在ForkJoinPool类中找到这样的代码

可以看到,并行度到底是多少,是由下面的参数来控制的。如果无法获取这个参数,则默认使用 CPU个数-1 的并行度。这个函数是为了计算密集型业务去设计的。如果你喂给它一大堆任务,它就会由并行执行退变成类似于串行的效 果。

解决方式

ForkJoinPool 并行数设置 方式一

parallelism这个变量是final的,一旦设定,不允许修改。也就是说,上面的参数只会生效一次。

System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "20");

注意:多个人设置不同的并行数 jvm加载类信息具体加载谁的值,那就不一定了。

ForkJoinPool 并行数设置 方式二

我们可以通过提供外置的forkjoinpool,也就是改变提交方式,来实现不同类型的任务分离

总结

一、不要在I/O密集型业务里 使用ParallelStream并行处理 性能会受影响

二、计算密集型业务里 可以考虑使用 并行数量设置 默认为当前机器CPU核数-1个

java8 并行流 parallelStream,在8核的机器上,启动了几个线程 java8 并行流 parallelStream,其实就是java集合接口Collection新增的一个方法。 default Stream<E> parallelStream() { return StreamSupport.stream(this.spliterator(), true); } parallelStream的存在,使得处理集合多了一种选择。parallelStream的底层实现, 并没有多么高大上的技术,而是我们熟知的多线程框架ForkJoin。 .. 阅读详情

相关推荐

别再乱用parallelStream了!Java8并行流实战避坑指南(附性能对比测试)

本文深入解析Java8并行流parallelStream的核心原理与实战避坑指南,通过性能对比测试揭示其适用场景与五大禁用情况。从ForkJoinPool工作机制到线程池隔离方案,提供全面的性能调优法则,帮助开发者高效利用并行流提升处理效率。

weixin_31102231的博客 346

Java8的新特性parallelStream()的概念、对比线程优势与实战

方法处理集合数据时,程序会自动将集合数据分成多个小块,然后将每个小块分配到一个线程上进行处理。而多线程的性能则取决于线程的数量、线程的实现方式、线程同步的开销等因素,需要进行详细的评估和优化。方法是 Java 8 中非常实用的一个方法,可以将集合数据分成多个小块并行处理,从而提高程序的执行效率。可以将集合数据分成多个小块,分配到多个线程并行处理,从而提高程序的执行效率。方法则可以将集合数据分成多个小块,分配到多个线程并行处理,从而提高程序的执行效率。类的一种扩展,提供了将集合数据并行处理的能力。

喜欢猪猪 1080

Java8中并行化流parallel的使用

前面讲Stream的常用api的使用,在处理一些集合数据时很方便,但是在执行一些耗时或是占用资源很高的任务的时候,串行化的流无法带来速度/性能上的提升,除了使用多线程来并行执行任务之外,Stream中也提供了这样的方法。parallelStream()方法或者是使用stream().parallel()来转化为并行流。

BADAO_LIUMANG_QIZHI的博客 3114

for循环,stream,parallelStream的性能区别

for循环for循环的性能随着数据量的增加性能也越来越差。普通的循环不涉及较大的数据量,使用for循环更好。s 重庆干部培训学校 https://www.ganxun.cn/searchschool/cq.html tream(串行流)stream在数据量小的情况下性能差,在数据量中、大的时候性能略高于for循环,但当数据量特别大的时候,性能也变得越来越差。parallelStream(并行流)parallelStream适用的场景是CPU密集型的,加入电脑本身CPU负载很大,parallelStream并

cmdos的专栏 1436

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

本篇文章给大家用代码实例做了segmentfaultjava8中parallelStream性能测试,并对测试结果做了说明,需要的朋友学习下吧。

Linux SMP系统多核启动机制详解

对称多处理(SMP)是现代操作系统支持多核并行计算的基础架构。其核心原理是通过引导处理器(BSP)初始化系统环境后,通过处理器间中断(IPI)机制唤醒应用处理器(AP)。在x86架构中,AP启动时处于实模式,需要特殊的trampoline代码完成保护模式切换和分页设置。这种设计既保证了系统初始化的正确性,又实现了多核并行处理的性能优势。理解SMP启动流程对优化系统启动速度和调试多核问题至关重要,特别是在云计算和嵌入式系统中,高效的SMP初始化能显著提升系统响应能力。本文以Linux内核为例,深入解析了从BS

weixin_35006125的博客 291

Java并行流实战:从原理到避坑,全面解析parallelStream性能优化

在Java并发编程中,多线程技术是提升程序性能的核心手段之一,其原理在于将任务分解并分配到多个处理器核心并行执行,从而充分利用现代计算机的多核架构。这种技术对于处理计算密集型或可并行化的I/O密集型任务具有重要价值,能够显著提升吞吐量和响应速度,广泛应用于大数据处理、批量计算和高性能服务等场景。Java 8引入的Stream API中的parallelStream特性,正是基于Fork/Join框架实现的一种高效数据并行处理工具。本文将深入探讨parallelStream的底层机制,包括任务拆分、工作窃取算

weixin_34342992的博客 370

MuJoCo 机械臂关节空间阻抗控制Impedance实现(附代码)

阻抗控制通过调整关节的刚度和阻尼,让机器人在接触时产生顺应性,减少冲击力,其核心目标是在接触外部载荷时能够自适应调整输出力矩,实现力与位置的协同控制。阻抗控制可以很快的到达设定位置,在此基础上,使用mujoco交互中的施加外力操作,可以看到当外力松开后,机械臂也可以很快的回弹回设定位置。其中self.Kp和self.Kd为固定刚度和阻尼系数,通过修改刚度和阻尼参数,可以变得更柔顺来应对各种场景。注释掉该行后,直接simulate仿真可以看到机械臂控制位置震荡等情况,接下来引入关节空间阻抗控制的代码。

darcsdn 1276

Java如何通过并行流(ParallelStream)实现高性能数据处理核心机制与实战要点

## Java 中并行流 (ParallelStream) 的高性能数据处理核心机制与实战要点#### 并行流原理与核心机制。

m0_67891092的博客 334

YOLOv13改进策略【Backbone/轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 671

Calibre :Standard Verification Rule Format(SVRF) Manual (1-2)

摘要:SVRF规则文件是用于Calibre和ICverify工具的脚本文件,包含层定义、规则检查、注释、预处理指令等元素。规则文件支持全局/局部层定义、隐式层操作,以及条件编译指令(#DEFINE/#IFDEF等)。宏功能(DMACRO/CMACRO)可实现代码复用,支持参数化层操作和嵌套调用。预处理指令支持版本控制(#IFDEFCALIBRE_VERSION)和环境变量默认值设置(#PRAGMAENV)。宏中的层名具有局部作用域,可通过特殊语法实现全局层名指定,LOCAL()修饰符可创建调用作用域内的唯一

u013620135的博客 1342

Java8并行流(parallelStream)性能调优与避坑指南

本文深入探讨Java8并行流(parallelStream)的性能调优与常见陷阱,提供从数据源选择、线程池配置到操作优化的全方位指南。通过实战案例展示如何避免LinkedList等低效数据源,正确使用自定义线程池,以及优化limit()、findFirst()等操作,帮助开发者将并行流性能提升16倍。文章特别强调注意事项如线程安全、异常处理和Spring事务兼容性,是Java8并行编程的必备避坑手册。

weixin_31364787的博客 176

PCL 点云配准-ICP算法(精配准)

ICP(Iterative Closest Point)算法是一种常用的点云精细配准算法。它通过迭代计算将一组点云变换到另一组点云的最佳位置,最终实现精确的对齐。ICP算法在每次迭代中选择与目标点云最接近的点作为对应点,通过计算最小化源点云和目标点云之间的均方误差(MSE)来进行刚性变换(包括平移和旋转)。

纵马踏花向自由 1725

并行流ParallelStream中隐藏的陷阱

点击上方蓝字 ↑↑ Throwable文摘关注公众号设置星标,不定时推送高质量原创文章关注前提这篇文章介绍一下日常开发中并行流ParallelStream中隐藏的陷阱,这个问题其实离我们...

Throwable 4269

OpenFeign整合Sentinel实现熔断降级

常用于实现熔断降级的框架有Hystrix、Sentinel,我们常说的Spring Cloud项目说的其实是Spring Cloud Netflix,Hystrix以及前面学习过的Ribbon都是Netflix系的家族成员,所以使用Hystrix可以非常简单的与当前项目中使用到的OpenFeign、Ribbon整合,但笔者并没有选择Hystrix,而是选择阿里系的Sentinel。 为什么选择Sentinel而不是Hystrix?从接入简单考虑可能选择Hystrix是不错的选择,但笔者对Hyst...

吴就业 6718

微信小程序 - 详细解决web-view公众号文章或第三方网站分享转发后打开失败,页面显示“无法打开该页面,不支持打开“、“页面不存在“报错提示,苹果IOS系统手机打开是空白页,安卓手机系统会有提示!

微信小程序,公众号文章,第三方H5网页,内嵌网站分享后打不开,web-view,页面分享,小程序里公众号文章转发后无法打开,白屏,页面空白什么都没有,不支持打开,无法打开该页面,页面不存在,业务域名配置好了还是不行,公众号和小程序已经关联,iOS端苹果真机打开空白页,安卓手机,页面分享后,用户打不开提示错误,提示页面不存在,如何解决页面提示无法打开该页面,微信小程序web-view无法打开该页面不支持打开的解决方法,无法打开该页面不支持打开,最新详细解决方案,分享之后无法打开页面,提示无法打开该页面,不支持

🏆 前端领域优质创作者 1万+

【Java没基础】Java 8 并行流 ParallelStream

在前两篇的 Java 8 函数式编程的 blog 中,我们聊了 Lambda 表达式,聊了一些常用的 Stream API 和一些收集器方法。在今天,我们要考虑一下效率了。

一步一个脚印 2586

错误代码105(ERR_NAME_NOT_RESOLVED)详解与解决方案

错误代码105表示"",当您的浏览器无法将网站域名转换为IP地址时就会出现此错误。这是最常见的网络连接问题之一,通常与DNS(域名系统)有关。

欢乐打代码! 1万+

Java8并行流性能翻车现场:为什么我的parallelStream比单线程还慢?

本文深入剖析了Java8并行流parallelStream性能不升反降的常见原因。通过真实案例,揭示了其底层ForkJoinPool机制在I/O密集型任务、任务拆分不当及线程竞争等场景下的性能陷阱,并提供了JMH基准测试、线程池调优及自定义ForkJoinPool等实战优化策略。

q6r7s8t9的博客 716

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java8新特性——并行流parallelStream

今天是高考的日子,是大四师兄师姐答辩毕业的日子。一代又来,一代又去。好久没写博客,借此特殊日子整理一下前不久学java8新特性时写的代码,留下痕迹。(本博客的代码根据 java8新特性教程 学习整理,加上个人的理解而成,关于某个新特性的介绍代码里的注释已经阐述清楚,故不再写文字介绍,直接看代码吧!)     本篇介绍java8的新特性之一:lambda表达式。

Hello, world! 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java8 parallelStream浅析

JAVA8中引入了lamda表达式和Stream接口。其丰富的API及强大的表达能力极大的简化代码,提升了效率,同时还通过parallelStream提供并发操作的支持,本文探讨parallelStream方法的使用。 首先看下java doc中对parallelStream的定义。 A sequence of elements supporting sequential and parallel aggregate operations. ... Stream pipelines may

MyySophia的博客 695

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java并行流(parallelStream)深度解析

/ 实现方法...先测试后优化:不要假设并行一定更快,实际测量性能避免副作用:确保lambda表达式没有副作用考虑顺序性:需要顺序保证时使用顺序流合理设置并行度:根据CPU核心数和任务特性调整注意数据结构:ArrayList比LinkedList更适合并行处理避免自动装箱:使用原始类型流(IntStream等)提升性能并行流是强大的工具,但需要谨慎使用。正确使用时可以显著提升性能,错误使用则可能导致问题。理解其工作原理和适用场景是有效使用并行流的关键。

hi星尘的博客 974

【JDK 8-集合框架进阶】6.1 parallelStream 并行流

一、parallelStream并行流 1.1 串行 和 并行的区别 > 执行结果 二、问题 2.1 paralleStream 并行是否一定比 Stream 串行快? 2.2 是否可以都用并行? > 报错 三、实战 > 执行结果 四、总结

ladymorgana的博客 507

Java8并行流---并行数据处理与性能

并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流。这是一个全局设置,因此它将影响代码中所有的并行流。一般而言,让ForkJoinPool的大小等于处理器数量是个不错的默认值,除非你有很好的理由,否则我们强烈建议你不要修改它。并行流内部使用了默认的ForkJoinPool,它默认的线程数量就是你的处理器数量,这个值是由Runtime.getRuntime().availableProcessors()得到的。看看流的parallel方法,你可能会想,并行流用的线程是从哪儿来的?

Blue_Pepsi_Cola的博客 1407

Java 多线程之并行流(parallelStream)

并行流是Java中Stream API的一部分,用于在多核处理器上并行执行流操作。在Java 8及更高版本中引入的Stream API提供了一种新的处理集合的方式,使得开发者能够更轻松地进行数据处理和操作。在使用Stream API时,可以将集合转换为流,然后进行各种操作,例如过滤、映射、排序等。在这个过程中,流可以是串行流(Sequential Stream)或并行流(Parallel Stream)。并行流通过使用多线程并行处理数据,充分利用多核处理器的优势,从而在某些情况下提高处理速度。

QIFU的专栏 1万+

stream流(含并行流parallelStream)与for循环处理集合性能(时间)对比

最近处理报表数据,经常需要使用stream,一直听说stream性能不佳,突然想知道差别在哪儿,写了几个实例测试了一下。 @Data public class StudentInfo { @ApiModelProperty(value = "班级id") private int classId; @ApiModelProperty(value = "姓名") private String name; @ApiModelProperty(value = "课程成

kumubajie的博客 4096
上一篇: Project Reactor源码阅读-Scheduler
下一篇: nigix代理失败的排查过程
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值