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 实战》                                                                                   遍历

相关文章
相关标签/搜索