2

在「Java 8 in action」(由Urma,Fusco和Mycroft撰寫)一書中,他們強調了並行流在內部使用公用分支連接池,並且儘管可以在全局配置,使用System.setProperty(...),它不可能爲單個並行流指定值。並行流與CompletableFuture之間的區別

我已經看到workaround,涉及在定製的ForkJoinPool中運行並行流。

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

他們繼續展示一個解決方案,並認爲CompletableFuture在這種情況下更好,因爲可以使用自定義的Executor來配置它,並且具有用戶選擇的線程池大小。當他們更新解決方案以利用它時,性能顯着提高。

這使我想 - 如果使用上面強調的解決方法對並行流版本執行相同的操作,性能優勢會是否相似,並且兩種方法在性能方面會再次相似嗎?在這種情況下,爲什麼選擇CompletableFuture而不是平行流呢?這顯然需要開發者更多的工作。

回答

3

在這種情況下,爲什麼選擇CompletableFuture而不是平行流時,它顯然需要開發者更多的工作。

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

CompletableFuture<String> downloadHttp(URL url); 

在這種情況下,只有一個completable未來是有道理的,因爲你可能會想要做別人無關,而你等待數據下來的東西。

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

相關問題