美文网首页
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