美文网首页
parallel stream 的线程分配

parallel stream 的线程分配

作者: aix91 | 来源:发表于2018-09-13 20:29 被阅读0次

    在使用parallel stream时,我们知道它会并行地遍历集合中的元素,但是系统并不会为每一个元素分配一个线程,那么接下来,我们就来看看,parallel stream的线程分配情况。

    1. 一个parallel stream 分配线程

    图一:测试代码1 图二:parallel stream 线程分布

    从上面的结果中我们可以得出以下几个结论:

        1. parallel stream 并不会为每个元素分配一个线程;线程是由commonPool来分配的,线程的数量由commonPool来决定。

        2. main 线程也参与到stream中来

    既然是commonPool来控制线程分配,那么我们就可以通过如下语句来改变分配的线程数:

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

    图三:线程分配

    2. 两个parallel stream 的线程分配

    图四:代码二 图五:两个parallel 的线程分配

    从上图中我们可以得出:2个parallel 公用了commonPool的线程,只有当parallel 1  结束了,commonPool才会为parallel 2 分配线程

    3. 如何让parallel单独的拥有thread pool?

    为了让每个parallel拥有自己的thread pool,我们可以按下面的方式人为地定义一个ForkJoinPool

    图六:代码三 图七:私有fork join pool的线程分配

    从上图中,我们可以看到,parallel1, parallel2 分别使用着两个pool,并且是并行执行的

    4. 总结

        a. parallel stream 的线程是由commonForkJoinPool 分配

        b. parallel stream 会占用主线程

        c. 多个parallel 会公用同一个commonForkJoinPool

        d. 每个parallel 可以使用各自的thread pool

    相关文章

      网友评论

          本文标题:parallel stream 的线程分配

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