在Java 8并行Streams中,终端操作在返回之前是否完成所有计算?

Apr*_*rel 3 java java-8

例如,如果类Foo有实例方法bar(),

List<Foo> list = new ArrayList<>();
// ...
list.stream()
    .parallel()
    .forEach(Foo::bar);
doSomething();
Run Code Online (Sandbox Code Playgroud)

是否保证调用bar()之前返回的所有调用doSomething()

Apr*_*rel 5

是的,除了终端操作是iterator()或者spliterator().

java.util.stream包页面:

在几乎所有情况下,终端操作都很渴望,在返回之前完成数据源的遍历和管道的处理.只有终端操作iterator()和spliterator()不是; 这些是作为"逃生舱口"提供的,以便在现有操作不足以执行任务时启用任意客户端控制的管道遍历.

  • 但请注意,当操作未正常完成时,这不会成立.在异常情况下,可能会在捕获它时仍然运行并发操作. (4认同)