Java Stream并行流:线程数量如何确定与控制?
并行流的线程数量:确定、查看与控制
一、默认线程数的确定逻辑
Java并行流默认依赖ForkJoinPool.commonPool()执行任务,这个公共池的默认线程数规则很明确:
- 通常为 CPU核心数 - 1(可通过
Runtime.getRuntime().availableProcessors()获取当前机器的CPU核心数) - 若机器是单CPU核心,默认线程数会直接设为1
二、查看当前使用的线程数
有两种直观方法:
- 通过ForkJoinPool API查询:
- 查看公共池的总工作线程数:
ForkJoinPool.commonPool().getPoolSize() - 查看当前活跃的线程数:
ForkJoinPool.commonPool().getActiveThreadCount()
- 查看公共池的总工作线程数:
- 打印线程名称:在并行流的
forEach逻辑里加入线程名打印,比如:
输出会看到类似something.stream().parallel().forEach(item -> { System.out.println("当前线程:" + Thread.currentThread().getName()); // 你的业务逻辑 });ForkJoinPool.commonPool-worker-1、ForkJoinPool.commonPool-worker-2的线程名,数不同的worker编号就能知道实际用到的线程数量。
三、控制并行流的线程数量
方式1:修改公共池的全局配置
通过JVM启动参数设置系统属性,全局修改commonPool的线程数:
java -Djava.util.concurrent.ForkJoinPool.common.parallelism=6 YourMainClass
也可以在代码中动态设置(需在并行流执行前调用):
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "6");
方式2:使用自定义ForkJoinPool
如果不想影响全局公共池,可创建自定义线程池,将并行流任务提交到该池中执行:
// 创建一个拥有4个线程的自定义池 ForkJoinPool customPool = new ForkJoinPool(4); try { // 提交并行流任务并等待完成 customPool.submit(() -> { something.stream().parallel().forEach(item -> { // 你的业务逻辑 }); }).join(); } finally { // 关闭自定义池 customPool.shutdown(); }
这种方式下,并行流会优先使用当前所在的自定义ForkJoinPool,而非公共池。
内容的提问来源于stack exchange,提问作者queeg
相关产品推荐
相关产品推荐

