[英]Java Stream API: why the distinction between sequential and parallel execution mode?
[英]The Difference between Parallel and Sequential Stream in terms of Java 1.8
在Java 1.8方面,順序流和並行流之間的功能差異是什么 ,以及輸出將如何受到影響?
在哪種情況下選擇並行或順序流?
Java中順序和並行流的處理方法差異是什么?!!
我已經嘗試過以下片段用少量數據進行測試,但我的輸出沒有任何異常差異。!!
ArrayList<Integer> arrayList = new ArrayList<>();
for(int i = 1; i <= 100;i++) arrayList.add(i);
arrayList.stream().filter(l -> l > 90).forEach(l -> System.out.println(l));
arrayList.parallelStream().filter(l -> l > 90).forEach(l -> System.out.println(l));
由於您正在創建並行流,因此可以通過不同的線程處理流的元素。 並行流允許多個線程獨立地處理流的各個部分。 您使用parallelStream()
的代碼說明了如何利用多個內核。
在100個元素上使用parallelStream()
時,您看不到很大的區別。 你需要擁有更多。
談到排序,使用forEach
和forEachOrdered
也有兩種方法可以實現。 它們之間的區別在於forEach將允許以任何順序處理並行流的任何元素,而forEachOrdered將始終按照它們在原始流中的出現順序處理並行流的元素。 因此,在這種情況下,如果您按原樣離開,則無法保證訂單。
對於您的具體示例, 您很幸運沒有看到任何差異(將循環添加到101
以便元素在線程中分布更差並查看差異) forEach
記錄為:
此操作的行為明確是不確定的
因此,至少對於並行處理,將沒有訂單 - 至少在某種意義上,您無法依賴。 還有就是forEachOrdered
, 做保證順序-你需要它的情況。
選擇parallel
或sequential
並不容易 - 您應該測量, Brian的建議是最好的閱讀
通常,並行流基本上是將其元素分成多個塊的流,使用不同的線程處理每個塊。 因此,您可以在多核處理器的所有核心上自動對給定操作的工作負載進行分區,並使所有核心處理器保持同等忙碌狀態。
但是,重要的是要注意,僅通過調用parallelStream()
並不一定使流並行,事實上,調用此方法甚至可能返回順序流而不是並行流。
如java doc中所述:
default Stream<E> parallelStream()
以此集合作為源返回可能並行的Stream。 此方法允許返回順序流 。
因此,我們可以得出結論由庫確定是否適合使用多個線程。 在大多數情況下,當需要處理大量數據時就會出現這種情況 。
在你的情況下, ArrayList
似乎只有100個元素,因此無論你是否使用parallelStream()
都沒有區別。
最后,但並非最不重要的是,我總是使用順序流以順序方式處理數據,除非需要處理大量數據或者遇到性能問題時使用順序流處理數據你可以切換到parallelStream 。
Stream的文檔聲明parallel
是流的屬性,但是沒有添加很多關於實現規范的內容。
不同之處在於在流上執行聲明性操作。 在大多數情況下,除非結果是重要的,否則差異不會顯示。
可以在您正在調用的forEach
終端流方法中找到對差異的最佳解釋。 Stream.forEach
的文檔規定:
此操作的行為明確是不確定的。 對於並行流管道,此操作不保證遵守流的遭遇順序,因為這樣做會犧牲並行性的好處。 對於任何給定元素,可以在任何時間以及庫選擇的任何線程中執行該動作 。 如果操作訪問共享狀態,則它負責提供所需的同步。
換句話說,順序流以犧牲並發性為代價來保證順序。 這只是其中之一。
在Java方面,順序流和並行流之間的功能區別是什么
不應該有任何誤解:並行處理與並發處理不同。
在哪種情況下選擇並行或順序流?
使用並行流可能有用也可能沒有用,它實際上取決於您使用的是什么。 有時它們更快,有時甚至更慢。
有一種說法如果你能做某事並不意味着你應該做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.