下面创建一个并行流,与顺序流
//顺序流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之后进行的所有操作都并行执行。
请注意 ,不能将两个方法结合起来,以为可惜更细化地控制在遍历流时哪些操作要并行,哪些操作要顺序执行。例:
Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .sequential() //转顺序流 .map(...) .parallel() //转为并行流 .reduce(0L, Long::sum);
但最后一次parallel或sequential调用会影响整个流水线。在上面,流水线会并行执行,因为最后调用 的是它。
1 .并行 流内部使用了默认的ForkJoinPool,它默认的纯种数量就是你的处理器数量,这个值是由 Runtime.getRuntime().availableProcessors() 得到的。
2. 可以 通过系统属性 来改变线程池的大小,如:
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12");
这是一个全局设置,因此它将影响代码中所有的并行 流。反过来说,目前还无法专为某个并行流指定这一个值。一般而言,让ForkJoinPool的大小等于处理器数量是个不错的默认值,除非你有很好的理由,否则我们强烈建议你不要修改它。
----摘自《java 8 实战》