gpt4 book ai didi

java - 使流平行于 flatMap 的结果

转载 作者:行者123 更新时间:2023-12-03 11:20:09 25 4
gpt4 key购买 nike

考虑以下简单代码:

Stream.of(1)
.flatMap(x -> IntStream.range(0, 1024).boxed())
.parallel() // Moving this before flatMap has the same effect because it's just a property of the entire stream
.forEach(x -> {
System.out.println("Thread: " + Thread.currentThread().getName());
});
很长一段时间,我认为即使在 flatMap 之后,Java 也会对元素进行并行执行。 .但是上面的代码打印了所有的“Thread:main”,证明我的想法是错误的。
flatMap 之后使其平行的简单方法将是收集然后再次流式传输:
Stream.of(1)
.flatMap(x -> IntStream.range(0, 1024).boxed())
.parallel() // Moving this before flatMap has the same effect because it's just a property of the entire stream
.collect(Collectors.toList())
.parallelStream()
.forEach(x -> {
System.out.println("Thread: " + Thread.currentThread().getName());
});
我想知道是否有更好的方法,以及 flatMap的设计选择只在调用之前并行化流,而不是在调用之后并行化。
========关于问题的更多说明========
从一些答案来看,我的问题似乎没有完全表达出来。正如@Andreas 所说,如果我从 3 个元素的 Stream 开始,可能有 3 个线程正在运行。
但我的问题确实是:根据 this post,Java Stream 使用一个通用的 ForkJoinPool,其默认大小等于内核数少 1。 .现在假设我有 64 个内核,那么我希望我上面的代码在 flatMap 之后会看到许多不同的线程。 ,但实际上,它只看到一个(或在 Andreas 的情况下看到 3 个)。顺便说一句,我确实使用了 isParallel观察流是并行的。
老实说,我问这个问题并不是为了纯粹的学术兴趣。我在一个项目中遇到了这个问题,该项目提供了一长串用于转换数据集的流操作。链从一个文件开始,通过 flatMap爆炸成很多元素.但显然,在我的实验中,它并没有完全利用我的机器(有 64 个内核),而只使用了一个内核(从 CPU 使用情况的观察来看)。

最佳答案

I was wondering [...] about the design choice of flatMap that only parallelizes the stream before the call, but not after the call.


你错了。 flatMap 之前和之后的所有步骤并行运行,但它只在线程之间拆分原始流。 flatMap操作然后由一个这样的线程处理,并且它的流不会被拆分。
由于您的原始流只有 1 个元素,因此无法拆分,因此 parallel没有效果。
尝试更改为 Stream.of(1, 2, 3) ,您将看到 forEach ,这是在 flatMap 之后, 实际上运行在 3 个不同的线程中。

关于java - 使流平行于 flatMap 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64020922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com