为什么parallelStream() 大多数时候从特定点开始?

问题描述

我有以下使用并行流打印列表元素的代码

List<Integer> l = List.of(0,1,2,3,4,5,6,7,8,9);
for (int j = 0; j < 5; j++) {
    l.parallelStream().forEach(i->System.out.print(i+" "));
    System.out.println();
}

输出

6 5 2 8 4 3 9 7 0 1 
6 5 8 9 2 7 4 1 0 3 
6 5 8 9 7 2 4 3 0 1 
6 5 8 9 7 1 0 4 3 2 
6 5 1 0 4 3 2 9 7 8 

为什么并行流大多数时候从 6 开始?
为什么不从 0 开始?为什么不在中期?

解决方法

列表正在拆分,处理开始使用公共池中的线程。更改代码以打印当前线程名称表明主调用线程也从拆分列表进行处理,并且其结果通常出现在公共池线程之前 - 大概是因为公共线程开始处理第一个条目之前有一个小延迟:

List<Integer> l = List.of(0,1,2,3,4,5,6,7,8,9);
for (int j = 0; j < 5; j++) {
    l.parallelStream().forEach(i->System.out.println(Thread.currentThread()+" i="+i));
    System.out.println();
}

在我的机器上,所有输出首先来自主线程:

Thread[main,main] i=6
Thread[main,main] i=5
Thread[main,main] i=8
Thread[main,main] i=9
Thread[main,main] i=7
Thread[main,main] i=2
Thread[main,main] i=4
Thread[main,main] i=3
Thread[main,main] i=1
Thread[main,main] i=0

但在随后的运行中,工作与公共池更加平衡:

Thread[main,main] i=7
Thread[ForkJoinPool.commonPool-worker-5,main] i=2
Thread[ForkJoinPool.commonPool-worker-5,main] i=4
Thread[ForkJoinPool.commonPool-worker-5,main] i=3
Thread[ForkJoinPool.commonPool-worker-5,main] i=1
Thread[ForkJoinPool.commonPool-worker-5,main] i=0

Thread[main,main] i=5
Thread[ForkJoinPool.commonPool-worker-5,main] i=9
Thread[ForkJoinPool.commonPool-worker-7,main] i=1
Thread[ForkJoinPool.commonPool-worker-7,main] i=0
Thread[main,main] i=4
Thread[ForkJoinPool.commonPool-worker-3,main] i=3