java8并行流

作者: 小傻黑 | 来源:发表于2019-02-14 18:25 被阅读51次

并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流,这样一来,你就可以自动把给定操作的工作负荷分配给多核处理器的所有内核,让它们都忙起来。

将顺序流转换为并行流

对并行流调用sequential方法就可以把它变成顺序流,比如

  stream.parallel()
        .sequential()
        .map(...)

这样这个stream最终又回到串行流。
看到这里,你可能以为把这两个方法结合起来,就可以更细化地控制在遍历流时哪些操作要并行执行,哪些要顺序执行,比如你可能会这样操作:

stream.parallel()
      .filter(...)
      .sequential()
      .map(...)
      .parallel().
      .reduce(...)

但其实这段代码并不能如你所愿,这个流的所有操作最终都是并行执行的。如果你在流中多次调用parallel和sequential,只有最后一次调用会决定整个流是串行还是并行。原因是流调用parallel或者sequential方法并不意味着流本身有任何实际的变化,它在内部实际上就是设了一个boolean标志,表示你想让调用parallel之后所有操作都并行执行或者sequential之后所有操作都串行执行,流的运行宏观上是将所有操作综合在一起运行的,迭代过程中并不会反复调用parallel与sequential,而是在一开始要迭代的时候就已经决定了流的属性。

配置并行流使用的线程池

并行流内部使用了默认的ForkJoinPool,它默认的线程数量就是你的处理器数量,这个值是由

Runtime.getRuntime().availableProcessors()

得到的。但是你可以通过系统属性java.util.concurrent.ForkJoinPool.common.parallelism来改变线程池大小

System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12");

高效使用并行流

1、数据涉及频繁自动拆箱/装箱操作慎用
2、数据量过小时慎用
3、数据结构不容易分解的情况慎用,比如链表这样的结构(但是可以自己实现Spliterator,指定分解策略,属于高级用法)。
4、涉及findFirst或者limit的操作慎用,因为这两种操作是依赖于顺序的,对于并行流开销比较大,这时候findAny()的性能更好。
5、流的终止操作代价过大的话也要慎用

相关文章

  • 并行流与顺序流

    ForkJoin框架 普通for java8并行流,底层就是forkjoin框架

  • Java8使用并行流(ParallelStream)注意事项

    Java8并行流ParallelStream和Stream的区别就是支持并行执行,提高程序运行效率。但是如果使用不...

  • 并行流和串行流

    并行流 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。 Java8中将并行进行了优化,...

  • JAVA 8 forkjoin实际体验

    JAVA8 函数编程 -都说java8 新的函数式编程特别是并行流式编程,但是并行流的性能并不一定就好 没有很复杂...

  • Stream

    并行流 并行流就是把一个内容分成多个数据库,并用不同的线程分别处理每个数据块的流 Java8中将并行流进行了优化,...

  • Java8并行流

    并发是多个任务共享时间段(由CPU切换执行,就像是在同时执行)并行是多个任务发生在同一时刻(真真正正的同时执行)(...

  • java8并行流

    并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流,这样一来,你就可以自动把给定操作的工作负...

  • jdk新特性 --> Stream流

    jdk 并行流 求和 java stream 流动 多条件分组和规约 1. 概述 Stream 是 Java8 中...

  • Java8并行流与并行排序

    1、使用并行流过滤数据 案例:统计1-1000000内所有的质数数量。 2、从集合中得到并行流 在函数式编程中,我...

  • Java8 Stream 并行流

    并行流就是把一系列数据自动拆分成多个数据块,并使用多个线程来处理这些数据块,这样就可以利用现代CPU多核的优势,把...

网友评论

    本文标题:java8并行流

    本文链接:https://www.haomeiwen.com/subject/qpaeeqtx.html