gpt4 book ai didi

java - Java并行流每次完成

转载 作者:行者123 更新时间:2023-12-03 12:51:34 25 4
gpt4 key购买 nike

我想澄清一下Java并行流的行为。如果我使用如下所示的并行流,是否可以保证下面代码中显示的“应在末尾发生”行仅在所有并行任务执行后才打印?

public static void main(String[] args) {
Stream.of(1, 2, 3, 5, 7, 8, 9, 10, 11, 23, 399, 939).parallel().forEach(
integer -> System.out
.println(Thread.currentThread().getName() + ", for number " + integer));
System.out.println("Should happen at the end");
}

反复进行的试验始终在末尾按预期方式打印“应该在末尾发生”,如下所示。这可能是由于 main线程也用于处理一些请求而发生的。在某些情况下是否有可能不使用 main线程,并且在这种情况下,将在所有 ForkJoinPool.commonPool-worker完成执行任务之前打印“应该在末尾发生”?
main, for number 7
main, for number 6
ForkJoinPool.commonPool-worker-9, for number 3
ForkJoinPool.commonPool-worker-9, for number 4
ForkJoinPool.commonPool-worker-4, for number 1
ForkJoinPool.commonPool-worker-4, for number 10
ForkJoinPool.commonPool-worker-2, for number 2
ForkJoinPool.commonPool-worker-11, for number 5
ForkJoinPool.commonPool-worker-9, for number 8
main, for number 9
Should happen at the end

最佳答案

流终端操作不是异步的。这意味着Java仅在forEach终止后才将控制权交还给调用线程。因此,在forEach之后打印的内容必须在控制台之后打印。

但是请注意,如果使用java.util.Logger API而不是System.out,则输出顺序将不可预测,因为日志记录API本身(主要出于性能原因)不能保证输出的顺序。

有关流操作的进一步阅读:Oracle official documentation

关于java - Java并行流每次完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60816121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com