java - Java 8 中的parallelStream 中产生了多少个线程?

标签 java multithreading java-8 java.util.concurrent

在JDK8中,当我使用parallelStream时会产生多少个线程?例如,在代码中:

list.parallelStream().forEach(/** Do Something */);

如果此列表有 100000 个项目,将生成多少个线程?

此外,每个线程都获得相同数量的要处理的项目还是随机分配的?

最佳答案

Oracle 并行流的实现[1]使用当前线程,此外,如果需要的话,还使用组成默认 fork join pool ForkJoinPool.commonPool() 的线程,它具有默认大小等于 CPU 核心数减一。

可以使用此属性更改公共(public)池的默认大小:

-Djava.util.concurrent.ForkJoinPool.common.parallelism=8

或者,您可以使用自己的池:

ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
    list.parallelStream().forEach(/* Do Something */);
).get();

关于顺序,只要有线程可用,作业就会立即执行,没有特定的顺序。

正如 @Holger 正确指出的那样,这是一个特定于实现的细节(文档底部只有 one vague reference),这两种方法都可以在 Oracle 的 JVM 上工作,但绝对不能保证在其他供应商的 JVM 上工作,该属性不可能存在于非 Oracle 实现中,并且 Streams 甚至无法使用 ForkJoinPool 在内部呈现基于 ForkJoinTask.fork 行为的替代方案,完全无用( see here 有关详细信息这个)。

关于java - Java 8 中的parallelStream 中产生了多少个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61973296/

相关文章:

java - 使用时间戳的准备语句需要更多纳秒

java - 在 JEditorPane 中的文本之间添加图像

java - 我的多线程代码运行速度并不快

c# - 如何在 C# 中正确终止工作线程

java - 为什么方法引用需要类型转换为 Function 接口(interface)?

java - 使用 Java Streams 使用通用标准从给定列表中过滤对象

java - JavaFX 分页中的自动幻灯片放映

java - Spring Security + LDAP 中的预认证

c# - C# ReaderWriteLock 中可升级读锁与写锁的区别

jvm - Java 8 : Why does Metaspace size increase but number of loaded classes stay the same?