Java 并行流(parallelStream)的具体使用小结

 更新时间:2025年11月26日 09:30:14   作者:心本不二  
parallelStream是Java 8中的一种流处理方式,通过并行流利用多核CPU提高数据处理效率,本文主要介绍了Java 并行流(parallelStream)的具体使用小结,具有一定的参考价值,感兴趣的可以了解一下

1. 什么是 parallelStream?

在 Java 8 中,Stream API 提供了 stream()parallelStream() 两种流处理方式。

  • stream() 采用顺序流处理数据,每个元素按照流的顺序依次处理。
  • parallelStream() 采用并行流处理数据,利用 ForkJoinPool 并发执行,提高处理效率。

2. parallelStream 的优势

  • 充分利用多核 CPU:并行流会将任务拆分为多个子任务,并分配到多个 CPU 核心执行。
  • 提升处理速度:适用于计算密集型任务,能明显提高大数据量的处理效率。
  • API 友好parallelStream() 的使用方式与 stream() 类似,开发成本较低。

3. parallelStream 的使用

3.1 基本使用

import java.util.Arrays;
import java.util.List;

public class ParallelStreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");
        
        // 使用并行流处理数据
        list.parallelStream().forEach(System.out::println);
    }
}

注意:并行流的输出顺序是无序的,因为多个线程并发执行。

3.2 计算总和示例

import java.util.stream.IntStream;

public class ParallelSum {
    public static void main(String[] args) {
        int sum = IntStream.rangeClosed(1, 100)
                           .parallel()
                           .sum();
        System.out.println("Sum: " + sum);
    }
}

3.3 结合groupingByConcurrent实现线程安全的分组操作

  • 使用parallelStream将分组过程并行化提升效率,使用groupingByConcurrentConcurrentMap避免出现线程安全的问题
Map<String, List<CourseGrade>> collect = courseGrades
										.parallelStream()
										.collect(Collectors.groupingByConcurrent(CourseGrade::getYear));

4. parallelStream 的注意事项

4.1 适用场景

适用场景不适用场景
数据量大数据量小
计算密集型任务IO 密集型任务
不关心执行顺序需要严格顺序执行
需要提升性能线程切换成本高

4.2 并行流的局限性

  1. 线程开销:并行流会使用 ForkJoinPool 线程池,线程的创建和切换会带来一定的开销。
  2. 数据竞争:如果流操作涉及共享变量,可能会出现线程安全问题。
  3. 不适合小数据量:并行执行存在一定的启动成本,数据量太小可能会降低性能。

5. 控制并行流线程数

默认情况下,parallelStream() 使用 ForkJoinPool公共线程池,线程数与 CPU 核心数相同。

如果需要自定义线程池大小,可以使用以下方式:

import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;

public class CustomParallelStream {
    public static void main(String[] args) {
        ForkJoinPool customPool = new ForkJoinPool(4); // 设置 4 个线程
        
        customPool.submit(() ->
            System.out.println(IntStream.range(1, 100)
                    .parallel()
                    .sum())
        ).join();
        
        customPool.shutdown();
    }
}

6. 总结

  • parallelStream() 能有效提高大数据量的处理效率。
  • 适用于计算密集型任务,但可能不适用于 IO 密集型任务。
  • 默认使用 ForkJoinPool,可以自定义线程池大小。
  • 需谨慎使用,避免线程安全问题和不必要的开销。

到此这篇关于Java 并行流(parallelStream)的具体使用小结的文章就介绍到这了,更多相关Java 并行流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis 如何开启控制台打印sql语句

    Mybatis 如何开启控制台打印sql语句

    这篇文章主要介绍了Mybatis 如何开启控制台打印sql语句问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MyBatis动态SQL表达式详解

    MyBatis动态SQL表达式详解

    动态SQL可以省略很多拼接SQL的步骤,使用类似于JSTL方式,下面这篇文章主要给大家介绍了关于Mybatis动态SQL特性的相关资料,文字通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Spring Modulith模块化单体应用的概念和优势

    Spring Modulith模块化单体应用的概念和优势

    本文将深入探讨Spring Modulith的核心概念、实现方式以及最佳实践,帮助开发者构建易于维护且具有良好扩展性的现代Java应用,感兴趣的朋友一起看看吧
    2025-09-09
  • SpringBoot集成P6Spy实现SQL日志的记录详解

    SpringBoot集成P6Spy实现SQL日志的记录详解

    P6Spy是一个框架,它可以无缝地拦截和记录数据库活动,而无需更改现有应用程序的代码。一般我们使用的比较多的是使用p6spy打印我们最后执行的sql语句
    2022-11-11
  • SpringBoot基于FFmpeg实现压缩视频切片为m3u8

    SpringBoot基于FFmpeg实现压缩视频切片为m3u8

    本文介绍了一个使用FFmpeg将MP4视频压缩切片为HLS格式M3U8文件的Java工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-02-02
  • java数据结构与算法之桶排序实现方法详解

    java数据结构与算法之桶排序实现方法详解

    这篇文章主要介绍了java数据结构与算法之桶排序实现方法,结合具体实例形式详细分析了桶排序的概念、原理、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • 详谈Spring框架之事务管理

    详谈Spring框架之事务管理

    下面小编就为大家带来一篇详谈Spring框架之事务管理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • SpringBoot3集成Kafka的方法详解

    SpringBoot3集成Kafka的方法详解

    Kafka是一个开源的分布式事件流平台,常被用于高性能数据管道、流分析、数据集成和关键任务应用,下面我们就来看看SpringBoot3是如何集成Kafka的吧
    2023-08-08
  • Hadoop源码分析一架构关系简介

    Hadoop源码分析一架构关系简介

    本篇是Hadoop源码分析系列文章第一篇,主要介绍一下Hadoop的基础简介以及框架关系,后续本系列文章会持续更新,有需要的朋友可以借鉴参考下
    2021-09-09
  • Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream

    Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream

    这篇文章主要给大家介绍了关于Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream的相关资料,ZipInputStream 和 ZipOutputStream 可以用于处理 ZIP文件格式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10

最新评论