【发布时间】:2016-03-28 20:26:39
【问题描述】:
前提:我已经阅读了this question 和其他内容,但我需要澄清一下。
我知道Stream.forEach 方法在处理并行流时(不仅)会有所不同,这解释了为什么会这样
//1
Stream.of("one ","two ","three ","four ","five ","six ")
.parallel()
.forEachOrdered(item -> System.out.print(item));
打印
one two three four five six
但是当涉及到中间操作时,流并行化时不再保证顺序。所以这段代码
//2
Stream.of("one ","two ","three ","four ","five ","six ")
.parallel()
.peek(item -> System.out.print(item))
.forEachOrdered(item -> System.out.print(""));
会打印类似的东西
four six five one three two
forEachOrdered 方法只影响其自身执行中元素的顺序是否正确?直觉上,我认为//1 的例子与
//3
Stream.of("one ","two ","three ","four ","five ","six ")
.parallel()
.peek(item -> System.out.print("")) //or any other intermediate operation
.sequential()
.forEach(item -> System.out.print(item));
我的直觉错了吗?我是否遗漏了整个机制的某些内容?
【问题讨论】:
-
不,你不能把一个操作变成并行,另一个变成顺序。传递给
forEachOrdered的操作仍然可能被不同的线程调用,但它们会适当地同步。 -
@Holger,我不明白...
-
多线程,在一点同步,仍然与单线程执行不同。
-
@Holger 我想我明白你的意思。但是对于我的具体情况,我只对元素顺序感兴趣而不考虑线程重叠问题,
//1和//3在概念上是否等效?
标签: java foreach java-8 java-stream