java 8 並行流 - 1

下面建立一個並行流,與順序流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 實戰》                                                                                   遍歷

相關文章
相關標籤/搜索