在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/