在使用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
网友评论