java—为什么parallelstream()大多数时候都是从特定的点开始的?

gt0wga4j  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(268)

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

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 ? 为什么不在中午呢?

rxztt3cl

rxztt3cl1#

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

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,5,main] i=6
Thread[main,5,main] i=5
Thread[main,5,main] i=8
Thread[main,5,main] i=9
Thread[main,5,main] i=7
Thread[main,5,main] i=2
Thread[main,5,main] i=4
Thread[main,5,main] i=3
Thread[main,5,main] i=1
Thread[main,5,main] i=0

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

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

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

相关问题