考虑以下示例:
IntStream.of(-1, 1)
.parallel()
.flatMap(i->IntStream.range(0,1000).parallel())
.forEach(System.out::println);
是否将内部标志设置为并行重要吗?不管我把它放在一边还是不放,结果看起来都很相似。
另外,为什么代码(ReferencePipeline
)对映射进行序列化?我被这个问题弄糊涂了。line
result.sequential().forEach(downstream);
发布于 2014-12-05 11:17:30
在当前JDK (jdk1.8.0_25),答案是否定的,
将内部标志设置为parallel并不重要,因为即使您设置了它,.flatMap()实现将流设置为
顺序这里:
result.sequential().forEach(downstream);
("result“是内部流,它的sequential()方法的文档说:返回一个连续的等效流。可能会返回自身,这是因为流已经是连续的,或者因为基础流状态被修改为连续的。)
在大多数情况下,可能会有不需要付出任何努力若要使内部流并行,请执行以下操作;如果外部流至少具有与可并行运行的线程数相同的项数(ForkJoinPool.commonPool().getParallelism() = 3
在我的电脑里)。
发布于 2021-02-26 20:48:30
对于像我这样的人来说,他们迫切需要并行化flatMap,需要一些实用的解决方案,而不仅仅是历史和理论。
我想出的最简单的解决方案是手工展平,基本上是用map + reduce(Stream::concat)
..。
已经在另一个帖子中发布了详细信息的答案:https://stackoverflow.com/a/66386078/3606820
https://stackoverflow.com/questions/24411313
复制相似问题