2014-06-25 97 views
11

您好我使用flatmap 考慮下面的例子並行和Flatmap在Java中8流

IntStream.of(-1, 1).parallel().flatMap(i->IntStream.range(0,1000).parallel()).forEach(System.out::println); 

不要緊,我是否設置內部標誌,以平行的時候有一個關於並行化的問題?如果我離開它,結果看起來非常相似。 爲什麼代碼(ReferencePipeline)將映射序列化?

result.sequential().forEach(downstream); 

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/stream/ReferencePipeline.java#ReferencePipeline.flatMap%28java.util.function.Function%29

+0

好吧,根據代碼中的評論'我們也可以做得更好;優化深度= 0的情況下,只是抓住spliterator和forEach it',我假設他們不必將它實現爲'result.sequential()。forEach(downstream)'並且可以使用並行實現來獲得更好的性能。 – Eran

回答

8

在目前的JDK(jdk1.8.0_25),答案是否定的,沒關係你設置內部標誌,以平行: 我被弄得線, 因爲即使你設置它,在.flatMap()實現設置的背上流順序這裏:

result.sequential().forEach(downstream); 

(「結果」是內部流,它的sequential()方法的文檔說:返回順序的等效流。可能返回本身,要麼是因爲流已經是連續的,或者是因爲底層的流狀態被修改爲順序)

在大多數情況下,有可能是沒有力氣使流並行內。如果外部流至少具有與可並行運行的線程數相同的項目數(我的計算機中的ForkJoinPool.commonPool()。getParallelism()= 3))。

+0

我稍微不同意最後的說法。只有每個外部元素的計算負載大致相等纔是真實的。 – benehsv