iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Java8并行流(parallelStream)的注意点
  • 506
分享到

基于Java8并行流(parallelStream)的注意点

2024-04-02 19:04:59 506人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

Java8并行流(parallelStream)注意点 在最初使用并行流的时候,查询列表会偶尔性报空指针异常,这令我非常纳闷 代码是这样的: List<OrderListV

Java8并行流(parallelStream)注意点

在最初使用并行流的时候,查询列表会偶尔性报空指针异常,这令我非常纳闷

代码是这样的:


List<OrderListVO> orderListVOS = new LinkedList<OrderListVO>();

baseOrderBillList.parallelStream().forEach(baseOrderBill -> {
   OrderListVO orderListVO = new OrderListVO();
   // 设置order中的属性

   orderListVO.setOrderbillgrowthid(baseOrderBill.getOrderbillgrowthid());
   orderListVO.setOrderbillid(baseOrderBill.getOrderbillid());
   ……
   orderListVOS.add(orderListVO);
}

代码本身是在做多表拆分然后业务层组装,使用并行流能够提升这种纯粹的CPU密集型操作,parallelStream 此方法默认是以服务器CPU核数为线程池大小的。

因为是并行流,所以其实是多线程并发操作这个orderListVOS 容器,但是这个容器是不能保证线程安全的。

修改之后:


List<OrderListVO> orderListVOS = Collections
.synchronizedList(new LinkedList<OrderListVO>());

这样就能得到理想的结果。

另外,stream自带最后的聚合方法:


List<OrderListVO> orderListVOS = orderListVOS.parallelStream()
                .sorted(Comparator.comparing(OrderListVO::getCreatetime).reversed())
                .collect(Collectors.toList());

collect(Collectors.toList()) 方法最后回将操作后的数据进行汇总,此方法本身实现了线程安全性的操作,最后得到的结果也会是正确的。

JAVA8之parallelStream()并行流的正确用法

1.因为是并行流,所以所涉及到的数据结构

需要使用线程安全的,比如


listByPage.parallelStream().forEach(str-> {
           //使用线程安全的数据结构
           //ConcurrentHashMap
           //CopyOnWriteArrayList
           //等等进行操作
        });

2.默认优先用在CPU密集型计算中

这里有的人就说了,用在IO密集比如Http请求啊什么的这种耗时高的操作并行去请求不是效果显著吗

由于默认并行流使用的是全局的线程池,线程数量是根据cpu核数设置的,所以如果某个操作占用了线程,将影响全局其他使用并行流的操作

所以折中的方案是自定义线程池来执行某个并行流操作


  ForkJoinPool forkJoinPool = new ForkJoinPool(10);
        forkJoinPool.execute(() -> {
            listByPage.parallelStream().forEach(str -> {
                
            });
        });

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

--结束END--

本文标题: 基于Java8并行流(parallelStream)的注意点

本文链接: https://www.lsjlt.com/news/131309.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Java8并行流(parallelStream)的注意点
    Java8并行流(parallelStream)注意点 在最初使用并行流的时候,查询列表会偶尔性报空指针异常,这令我非常纳闷 代码是这样的: List<OrderListV...
    99+
    2024-04-02
  • 基于Java8并行流有哪些需要注意的地方
    这篇文章主要介绍了基于Java8并行流有哪些需要注意的地方,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java8并行流(parallelStream)注意点在最初使用并行流...
    99+
    2023-06-20
  • Java8 如何正确高效的使用并行流
    目录正确使用并行流,避免共享可变状态高效使用并行流流的数据源和可分解性java 并行计算的几点实践总结正确使用并行流,避免共享可变状态 错用并行流而产生错误的首要原因,就是使用的算法...
    99+
    2024-04-02
  • aspectjweaver:关于Spring注解AOP的注意点
    在使用Spring注解AOP时,有以下几个注意点:1. 引入相应的依赖:在使用Spring注解AOP时,需要引入aspectjwea...
    99+
    2023-09-13
    Spring
  • Java8中怎么正确高效的使用并行流
    这篇文章主要为大家展示了“Java8中怎么正确高效的使用并行流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中怎么正确高效的使用并行流”这篇文章吧。正确使用并行流,避免共享可变状态错用...
    99+
    2023-06-25
  • 基于Springboot使用logback的注意事项
    Springboot logback的注意事项 项目使用SpringBoot搭建的,开发环境没有发现问题,日志输出位置也正常。 项目的日志没有使用默认配置文件名方式,而是一个环境一套...
    99+
    2024-04-02
  • 关于MyBatis通用Mapper@Table注解使用的注意点
    目录MyBatis通用Mapper@Table注解使用@Table注解的作用通用Mapper使用需要注意的问题首先是实体需要有相关的注解其次需要注意点事具体使用的依赖MyBatis通...
    99+
    2024-04-02
  • c++基础使用STL的注意点详解
    总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! ...
    99+
    2024-04-02
  • 基于python 开立方的注意事项说明
    在python中,** 就是指数运算,所以我们习惯性的觉得 确实在数学中,这的确是正确的,但是在python中这么写,你就会发现有一些错误, 4**3=64 所以,64开立方应...
    99+
    2024-04-02
  • SpringCloud Gateway的基本入门和注意点详解
    目录1.gateway和zuul2.使用gateway的路由功能1. 搭载springcloud gateway2.简单使用gateway1.application配置1.gatew...
    99+
    2024-04-02
  • 基于Transactional事务的使用以及注意说明
    Transactional事务的使用及注意 Transactional的事务使用,主要引用两个包中的Bean,一个是jpa的javax.transaction.Transaction...
    99+
    2024-04-02
  • python基于Appium控制多设备并行执行的示例
    小编给大家分享一下python基于Appium控制多设备并行执行的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现篇  首先实现对应的参数篇和对应的设备端口...
    99+
    2023-06-14
  • 基于Ant路径匹配规则AntPathMatcher的注意事项
    目录AntPathMatcher前言基本规则注意事项测试用例spring url匹配工具类----AntPathMatcher具体使用场景请求body的二次写入AntPathMatc...
    99+
    2024-04-02
  • 基于Security实现OIDC单点登录的详细流程
    目录一、说明二、OIDC核心概念三、什么是IDToken3.1.与JWT的AccessToken区别3.2.与UserInfo端点的区别四、OIDC单点登录流程五、SpringSec...
    99+
    2024-04-02
  • 基于Spring BeanUtils的copyProperties方法使用及注意事项
    如下所示: package com.demo; import lombok.Data; import org.springframework.beans.BeanUtils; i...
    99+
    2024-04-02
  • 基于controller使用map接收参数的注意事项
    目录controller使用map接收参数注意事项关于前端使用map去接收参数的问题正确封装姿势1正确封装姿势2controller使用map接收参数并用POSTman测试contr...
    99+
    2024-04-02
  • 关于golang高并发的实现与注意事项说明
    一、并发的意义 并发的意义就是让 一个程序同时做多件事情,其目的只是为了能让程序同时做另一件事情而已,而不是为了让程序运行的更快(如果是多核处理器,而且任务可以分成相互独立的部分,那...
    99+
    2024-04-02
  • 基于HLS创建Golang视频流服务器的优缺点
    HLS 是 HTTP Live Streaming 的缩写,是苹果开发的一种基于 HTTP 的自适应比特率流媒体传输协议, 并于 2009 年. HLS 流媒体已经成为应用最广泛的实...
    99+
    2024-04-02
  • Vue3中的setup执行时机与注意点说明
    目录setup执行时机与注意点setup执行时机在beforeCreate之前Vue3.0 setup()函数用法setup()函数作为在组件内部使用组合API的入口点setup()...
    99+
    2024-04-02
  • MySQL中基于WRITESET的并行复制方式是什么
    本篇内容主要讲解“MySQL中基于WRITESET的并行复制方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL中基于WRITESET的并行复制方...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作