Java之并行流(Parallel Stream)使用详解

2025-03-05 17:50

本文主要是介绍Java之并行流(Parallel Stream)使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java之并行流(ParallelStream)使用详解》Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集...

Java并行流(Parallel Stream)

并行流是Java 8引入的高效处理集合数据的工具,通过多线程加速计算。

以下是其核心概念、使用方法及注意事项的详细指南:

1. 核心概念与原理

  • 并行处理机制:将数据分割为多个块,利用Fork/Join框架在多个线程上并行处理,最后合并结果。
  • 默认线程池:使用ForkJoinPool.China编程commonPool(),线程数等于CPU核心数(可通过系统参数调整)。
  • 适用场景:大规模数据集、计算密集型任务(如数学运算、批量转换)。

2.China编程 创建并行流的方式

  • 直接生成:通过集合的parallelStream()方法。
  • 转换顺序流:在现有流上调用parallel()
List<Integer> list = Arrays.asList(1, 2, 3, 4);

// 方式1:直接生成并行流
Stream<Integer> parallelStream1 = list.parallelStream();

// 方式2:将顺序流转为并行
Stream<Integer> parallelStream2 = list.stream().parallel();

3. 适用场景与性能优化

推荐场景

  • 数据量大:如百万级元素的过滤、映射。
  • 计算复杂:如矩阵运算、图像处理。
  • 无状态操作:如mapfilterreduce(不依赖处理顺序或外部变量)。

性能陷阱

  • 小数据集:并行化开销(线程调度、数据分割)可能抵消收益。
  • 低耗时操作:如简单加减法,并行可能更慢。

4. 注意事项与最佳实践

避免共享可变状态

并行操作中修改共享变量会导致线程安全问题,应使用无状态操作或同步控制。

// 错误示例:线程不安全的累加
List<Integer> nums = Arrays.asList(1, 2, 3);
int[] sum = {0};
nums.parallelStream().forEach(n -> sum += n); // 结果可能错误

// 正确做法:使用归约
int safeSum = nums.parallelStream().reduce(0, Integer::sum);

谨慎使用有状态操作

sorted()distinct()在并行流中可能更耗时,需合并线程结果。

// 并行排序(可能比顺序流慢)
List<Integer> sortedList = nums.parallelStream().sorted().toList();

数据源的可拆分性

  • 高效结构ArrayList、数组(支持快速随机访问,易于分割)。
  • 低效结构LinkedListTreeSet(拆分成本高)。

顺序敏感操作

使用forEachOrdered保证顺序,但牺牲性能。

// 按顺序输出(性能低于无序操作)
list.parallelStream().forEachOrdered(System.out::编程China编程println);

配置线程池

默认线程数:

Runtime.getRuntime().availableProcessors(android)

修改全局线程数:

# JVM启动参数
-Djava.util.concurrent.ForkJoinPool.common.parallelism=8

5. 性能对比示例

// 顺序流 vs 并行流(处理1000万数据)
List<Lphpong> numbers = LongStream.rangeClosed(1, 10_000_000)
                               .boxed().collect(Collectors.toList());

// 顺序流耗时
long start = System.currentTimeMillis();
long seqSum = numbers.stream().mapToLong(n -> n * 2).sum();
System.out.println("顺序流耗时: " + (System.currentTimeMillis() - start) + "ms");

// 并行流耗时
start = System.currentTimeMillis();
long parSum = numbers.parallelStream().mapToLong(n -> n * 2).sum();
System.out.println("并行流耗时: " + (System.currentTimeMillis() - start) + "ms");

典型结果(8核CPU):

顺序流耗时: 120ms 并行流耗时: 35ms

总结

优势:简化多线程编程,提升大数据处理效率。

局限:不适合小数据量、顺序敏感或低计算量任务。

最佳实践

  • 优先处理大规模数据。
  • 避免操作共享变量。
  • 测试验证性能提升。
  • 使用forEach替代forEachOrdered除非必须保证顺序。

通过合理使用并行流,可在不增加复杂代码的情况下显著提升程序性能,但需结合场景权衡利弊。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Java之并行流(Parallel Stream)使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153645

相关文章

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

web网络安全之跨站脚本攻击(XSS)详解

《web网络安全之跨站脚本攻击(XSS)详解》:本文主要介绍web网络安全之跨站脚本攻击(XSS)的相关资料,跨站脚本攻击XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本诱使用户执行,可能... 目录前言XSS 的类型1. 存储型 XSS(Stored XSS)示例:危害:2. 反射型 XSS(Re

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Go 1.23中Timer无buffer的实现方式详解

《Go1.23中Timer无buffer的实现方式详解》在Go1.23中,Timer的实现通常是通过time包提供的time.Timer类型来实现的,本文主要介绍了Go1.23中Timer无buff... 目录Timer 的基本实现无缓冲区的实现自定义无缓冲 Timer 实现更复杂的 Timer 实现总结在