Java parallelStream并行流使用示例详解

 更新时间:2026年07月15日 10:34:12   作者:西凉的悲伤  
并行流是Java中Stream API的一部分,用于在多核处理器上并行执行流操作,这篇文章主要介绍了Java parallelStream并行流使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

parallelStream() 是 Java 8 Stream API 提供的 并行流(Parallel Stream)

它可以让:

  • 一个集合的处理逻辑
  • 自动使用多线程并行执行

而不是单线程。

一、最简单理解

普通 stream:

list.stream()

是 单线程

例如:

1个线程处理20万数据

parallelStream:

list.parallelStream()

是 多线程并行处理

例如:

8核CPU
可能8个线程同时处理

二、举个最简单例子

普通 stream :

list.stream()
    .map(x -> doSomething(x))
    .collect(Collectors.toList());

执行过程:

第1条
第2条
第3条
...

按顺序一个个执行。

parallelStream :

list.parallelStream()
    .map(x -> doSomething(x))
    .collect(Collectors.toList());

执行过程:

线程1 -> 第1万条
线程2 -> 第2万条
线程3 -> 第3万条
...

同时执行。

三、parallelStream底层是什么?

底层使用: ForkJoinPool

默认:

CPU核心数 - 1

例如:

8核CPU:

默认7个工作线程

四、parallelStream什么时候适合?

适合:CPU密集型任务

例如:

  • 大量计算
  • 加密
  • 哈希
  • 复杂规则计算
  • 图片处理
  • 金额计算
  • 风控计算

例如:

list.parallelStream()
    .map(this::calculate)

计算 很耗CPU。这时收益巨大。

五、什么时候不适合?

IO密集型

例如:

数据库
Feign
HTTP
Redis
文件

例如:

list.parallelStream()
    .forEach(x -> feign.call());

通常会更慢,甚至打爆数据库/接口。

六、为什么IO场景不适合?

因为,parallelStream 默认线程数:

CPU核数

而IO:

大量时间在等待

CPU其实没干活。

比如:

线程1 等数据库
线程2 等网络
线程3 等Redis

CPU闲着。

所以:

parallelStream 对IO提升有限。

七、parallelStream的优势

1. 开发简单

不用:

线程池
Future
CountDownLatch
CompletableFuture

一行搞定。

2. 自动线程调度

自动:

  • 分片
  • 分任务
  • 合并结果

3. CPU利用率高

例如:

8核CPU:

单线程只用了1核

parallelStream:

8核一起跑

八、parallelStream的缺点

很多人乱用。

缺点1:线程不受控

默认:

ForkJoinPool.commonPool()

全局共享线程池。

可能:

影响整个系统

缺点2:不适合数据库/Feign

例如:

parallelStream()
    .forEach(x -> mapper.insert(x));

危险。

可能 瞬间几千SQL。

缺点3:线程安全问题

例如:

你这样写:

List<String> result = new ArrayList<>();

list.parallelStream().forEach(x -> {
    result.add(x);
});

错误!

因为:

ArrayList线程不安全

可能:

  • 数据丢失
  • 数组越界
  • ConcurrentModificationException

正确写法

用:

collect(Collectors.toList())

因为 collect 内部处理了并发。

九、parallelStream为什么有时反而更慢?

因为:线程切换有成本

例如:

1+1

这种极小任务。

还没切线程快。

所以:数据量小不要用

经验:

数据量建议
<1000通常没必要
1万+开始有收益
10万+常有明显收益

十、parallelStream不保证顺序

例如:

list.parallelStream()
    .forEach(System.out::println);

输出:

乱序

如果需要顺序:

forEachOrdered()

但:性能会下降。

十一、真正高性能方案(推荐)

很多大系统:

不会直接用:

parallelStream

而是:

自定义线程池 + CompletableFuture

因为:

  • 可控
  • 可监控
  • 可限流
  • 可隔离

例如:

ExecutorService pool = Executors.newFixedThreadPool(8);

CompletableFuture.supplyAsync(() -> {
    return calculate();
}, pool);

十二、parallelStream vs 线程池

对比parallelStream线程池
简单非常简单较复杂
可控性
适合小功能非常适合一般
大型系统不推荐滥用推荐
自定义线程数不方便可以
隔离性

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

相关文章

  • WebSocket 中使用 @Autowired 注入对应为null的解决方案

    WebSocket 中使用 @Autowired 注入对应为null的解决方案

    SpringBoot集成WebSocket时,会遇到service对象为null的情况,原因是Spring默认为单例模式与WebSocket的多对象模式相冲突,当客户端与服务器端建立连接时,会创建新的WebSocket对象,本文给大家介绍WebSocket 中使用 @Autowired 注入对应为null的问题,感兴趣的朋友一起看看吧
    2024-10-10
  • SpringCache使用案例详解

    SpringCache使用案例详解

    这篇文章主要介绍了SpringCache使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 深度分析java dump文件

    深度分析java dump文件

    java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?
    2021-05-05
  • SpringCloud连接不上远程Nacos问题排查

    SpringCloud连接不上远程Nacos问题排查

    本文主要介绍了SpringCloud连接不上远程Nacos问题排查,可能是因为未开放端口,或集群内部通信异常等,下面就来介绍一下问题解决,感兴趣的可以了解一下
    2024-06-06
  • java实现账号登录时发送邮件通知

    java实现账号登录时发送邮件通知

    这篇文章主要为大家详细介绍了java如何实现在账号登录时发送邮件通知的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • java中类之间的数据传递方式

    java中类之间的数据传递方式

    这篇文章主要介绍了java中类之间的数据传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot多数据源配置的终极解决方案

    SpringBoot多数据源配置的终极解决方案

    在微服务架构和复杂业务场景中,一个Spring Boot应用连接多个数据库的需求日益普遍,本文将深入剖析Spring Boot自动配置的底层逻辑,揭示多数据源场景下的典型陷阱,并提供一套生产级解决方案,希望对大家有一定的帮助
    2025-05-05
  • springboot CompletableFuture异步线程池详解

    springboot CompletableFuture异步线程池详解

    这篇文章主要介绍了springboot CompletableFuture异步线程池的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java计算文本MD5加密值的方法示例

    Java计算文本MD5加密值的方法示例

    这篇文章主要介绍了Java计算文本MD5加密值的方法,结合实例形式分析了Java基于security实现md5加密算法进行文本加密相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • Java Convert Kotlin空指针异常的解决方法

    Java Convert Kotlin空指针异常的解决方法

    本文主要介绍了Java Convert Kotlin空指针异常的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论