下面建立一個並行流,與順序流java
//順序流 Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .reduce(0L, Long::sum); //並行流 Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .parallel() //轉爲並行流 .reduce(0L, Long::sum);
請注意 ,在實現中,對順序流調用 parallel方法 並不意味着流自己有任何實際的變化 。它在內部實際上就是設了一個boolean標誌,表示你想讓調用 parallel以後進行的全部操做都並行執行。線程
請注意 ,不能將兩個方法結合起來,覺得惋惜更細化地控制在遍歷流時哪些操做要並行,哪些操做要順序執行。例:code
Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .sequential() //轉順序流 .map(...) .parallel() //轉爲並行流 .reduce(0L, Long::sum);
但最後一次parallel或sequential調用會影響整個流水線。在上面,流水線會並行執行,由於最後調用 的是它。get
1 .並行 流內部使用了默認的ForkJoinPool,它默認的純種數量就是你的處理器數量,這個值是由 Runtime.getRuntime().availableProcessors() 獲得的。it
2. 能夠 經過系統屬性 來改變線程池的大小,如:class
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12");
這是一個全局設置,所以它將影響代碼中全部的並行 流。反過來講,目前還沒法專爲某個並行流指定這一個值。通常而言,讓ForkJoinPool的大小等於處理器數量是個不錯的默認值,除非你有很好的理由,不然咱們強烈建議你不要修改它。線程池
----摘自《java 8 實戰》 遍歷