簡體   English   中英

並行流和CompletableFuture之間的差異

[英]Difference between parallel stream and CompletableFuture

在“Java 8 in action”(Urma,Fusco和Mycroft)一書中,他們強調並行流在內部使用公共fork連接池,雖然這可以全局配置,例如使用System.setProperty(...),不可能為單個並行流指定值。

我已經看到了涉及在自定義ForkJoinPool中運行並行流的解決方法

在本書的后面,他們有一整章致力於CompletableFuture,在此期間他們有一個案例研究,他們比較使用parallelStream VS和CompletableFuture的各自表現。 事實證明它們的性能非常相似 - 它們強調了這一點的原因是它們都是默認使用相同的公共池(因此相同數量的線程)。

他們繼續展示解決方案並爭辯說CompletableFuture在這種情況下更好,因為它可以被設置為使用自定義Executor,其用戶選擇的線程池大小。 當他們更新解決方案以利用它時,性能得到顯着改善。

這讓我想到 - 如果使用上面突出顯示的解決方法為並行流版本做同樣的事情,性能優勢是否會相似,那么這兩種方法在性能方面是否會再次相似? 在這種情況下,為什么人們會選擇CompletableFuture而不是並行流,因為它顯然需要開發人員更多的工作。

在這種情況下,為什么人們會選擇CompletableFuture而不是並行流,因為它顯然需要開發人員更多的工作。

恕我直言這取決於您希望支持的界面。 如果您希望支持異步API,例如

CompletableFuture<String> downloadHttp(URL url);

在這種情況下,只有可完成的未來才有意義,因為您可能希望在等待數據下降時執行其他不相關的操作。

另一方面, parallelStream()最適合CPU綁定任務,您希望每個任務執行某些工作的一部分。 即每個線程使用不同的數據做同樣的事情。 你的意思是它也更容易使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM