简单介绍一下 Thread Pool,Stream 和 ParallelStream
在 Java 中,Thread Pool,Stream 和 ParallelStream 都是用于并行处理问题的工具。但它们的实现方式和适用场景却有所不同。
介绍
线程池(Thread Pool) 是 Java 多线程编程中的核心概念之一,开发者通过 ThreadPoolExecutor
可以灵活配置线程池的最小线程数(corePoolSize)、最大线程数(maximumPoolSize)、闲置线程存活时间(keepAliveTime)等关键参数。这种机制在异步任务处理和资源管理方面发挥着重要作用。
Stream 与 ParallelStream 是 JDK8 引入的流式编程特性。其中:
- Stream 是顺序流,默认在单线程中对数据集执行串行操作;
- ParallelStream 是并行流,能够充分利用多核 CPU 架构,通过多线程并行处理数据。
尽管 ParallelStream
和线程池都涉及多线程任务执行,但两者的实现机制存在本质差异:
线程资源管理
ParallelStream
底层统一使用 JVM 全局的 **ForkJoinPool.commonPool ()**,该公共池的线程数默认等于Runtime.getRuntime().availableProcessors()
(即 CPU 可用核心数)。例如在 8 核机器上,默认并行度为 7(实际为 CPU 核心数 - 1)。线程控制粒度
与可独立配置的ThreadPoolExecutor
不同,ParallelStream
无法直接为单个并行流指定专属线程池,所有并行流任务共享同一个公共池。虽然可以通过自定义ForkJoinPool
执行并行流任务(如new ForkJoinPool(N).submit(() -> stream.parallel().forEach(...))
)的方式,修改公共池的大小,但是这也会同时影响代码中所有ParallelStream
的线程池大小。这意味着:- 难以针对特定任务调整线程数
- 可能因多个并行流竞争线程资源导致性能波动