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

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J