我一直對Collections.parallelStream()
和Collections.stream().parallel()
之間的區別感到好奇。根據Javadocs,parallelStream()
嘗試返回並行流,而stream().parallel()
返回並行流。通過對我自己的一些測試,我發現沒有區別。這兩種方法的區別在哪裏?一個實現比另一個實現更有效嗎?謝謝。parallelStream vs stream.parallel
回答
即使它們在時刻的行爲相同也有區別 - 至少在您正確指出的文檔中有所不同;據我所知,未來可能會被利用。
目前的parallelStream
方法在Collection
接口定義爲:
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
作爲一個默認的方法可能在實現覆蓋(這就是Collections
內部類實際上做)。
暗示即使默認方法返回並行流,也可能有集合重寫此方法以返回non-parallel Stream
。這就是文檔可能是這樣的原因。
同時甚至parallelStream
回報順序數據流 - 它仍然是一個Stream
;然後你可以輕鬆地調用parallel
它:
Collections.some()
.parallelStream() // actually sequential
.parallel() // force it to be parallel
至少對我來說,這看起來很奇怪。
似乎文檔應該在某種程度上聲明,在調用parallelStream
之後,應該沒有理由再次調用parallel
來強制這樣做 - 因爲它可能對處理沒有用,甚至不好處理。
編輯
對於任何閱讀 - 請閱讀由霍爾格也的意見;它涵蓋的內容超出了我在這個答案中所說的內容。
很難想象一個場景,它是合理的流*源*拒絕流的並行處理,而不知道將要鏈接的實際操作。也許,如果它在自己的'Stream' API中實現,那麼它完全控制了調用'.parallel()'時會發生什麼...... – Holger
@Holger我沒有看到*可能是連續的部分*要麼。我也承認,看到一個不會從並行處理中受益的集合將是非常酷的。 – Eugene
那麼,一個空集合永遠不會受益於並行處理,但是,由於無論如何都不能保證線程的數量,所以仍然不讓'isParallel()'返回'true'。同樣,一個沒有'flatMap'操作的singleton集合中的流將永遠不會使用第二個線程,但是'isParallel()'返回'true'沒有任何壞處。這也適用於其底層分割器在'trySplit'中返回'null'的所有流;沒有像'sorted'或'flatMap'這樣的東西,不管你調用'.parallel()';它不會有任何影響。 – Holger
Collections.parallelStream()
和Collections.stream().parallel()
之間沒有區別。它們都會將流分割到底層分割器允許的範圍內,並且它們都將使用默認的ForkJoinPool運行(除非已經在另一個內部運行)。
- 1. Kotlin和parallelStream toArray
- 2. ChronicleMap和parallelStream
- 3. java 8 parallelStream()with sorted()
- 4. 的Java 8 parallelStream的FindFirst
- 5. JavaEE應用服務器中的CompletableFuture/parallelStream
- 6. java 8用parallelStream和stream減少
- 7. Java的8 parallelStream(...) - >填寫ArrayList的
- 8. Spark內部使用Java 8 parallelStream mapParitions
- 9. parallelStream中HashSet的線程安全性
- 10. 爲JMS消息創建分配ParallelStream處理
- 11. 的錯誤結果使用parallelStream()時降低()
- 12. 在Java8 parallelStream()中使用I/O + ManagedBlocker有什麼問題嗎?
- 13. 當計算a^b爲什麼並行不行,但parallelStream可能
- 14. 是java的AtomicReference在parallelStream中使用時線程安全嗎?
- 15. Java 8 ParallelStream內部Web應用程序容器
- 16. 使用parallelStream的foreach創建的HashMap,但有時值爲空
- 17. 如何在Java parallelStream中使用print(「\ r」+ progressMessage)?
- 18. 爪哇 - 爪哇8 parallelStream和創建線程自己
- 19. Java的parallelStream()與自定義池與呼叫者工作竊取?
- 20. 如何減少Java parallelStream中的線程數量?
- 21. Java 8嵌套ParallelStream不能正常工作
- 22. vs vs 2008 vs vs 2010
- 23. Exec的VS ExecWait VS ExecShell VS nsExec :: Exec的VS nsExec :: ExecToLog VS nsExec :: ExecToStack VS ExecDos VS ExeCmd
- 24. FTP vs SFTP vs HDFS vs NTFS vs EXT2,EXT3
- 25. VS VS VS VS 11中的MVC測試
- 26. CGL vs AGL vs OpenGL vs NSOpenGL vs CoreAnimation(CALayer)
- 27. MobileNet VS SqueezeNet VS ResNet50 VS啓V3 VS VGG16
- 28. NTOSKRNL.EXE VS NTKRNLMP.EXE VS NTKRNLPA.EXE VS NTKRPAMP.EXE
- 29. VS 2008 vs VS 2008 Express
- 30. RailwayJS vs Geddy vs Express vs Socket.IO
簡答:沒有區別。長答案:沒有差別。他們只是彼此的別名。 –
我只是找到了一些東西,我不知道它是否代表它們的區別?請參閱http://stackoverflow.com/questions/44013553/when-calculate-ab-why-parallel-not-work-but-parallelstream-could – zhuguowei