CompletableFuture anyOf

问题描述 投票:0回答:1

所以之前我考试的时候,有这样一道题。

第五题:异步编程(8分

请考虑下面的程序。方法 doSomething ( ) 可能会运行一段不确定的时间。

import java.util.concurrent.CompletableFuture;
class CF {
  static void doSomething() { .. }
  
  static CompletableFuture<Void> printAsync(int i) {
    return CompletableFuture.runAsync(() -> {
        doSomething();
        System.out.print(i);
    });
  }

  public static void main(string[] args) {
    CompletableFuture.anyof(
         printAsync(1)
           .thenRun(() -> printAsync(2)),
         printAsync(3))
      .thenRun(() -> printAsync(4));
    dosomething();
  }
}

如果main正常运行完成,程序可能打印的输出是什么?

如果给定的输出是可能的,请用 "是 "来填空。如果main永远不会打印给定的输出,则用字符串 "no "填入空白处。注意,本题将由机器人评分。所以,填入任何其他文字,如 "NO!"、"Yes,因为......"、"Never!"等,都会导致答案被标记为错误,即使答案的意图是正确的。

(a) 1 (b) 2 (c) 3 (d) 4 (e) 12 (f) 14 (g) 23 (h) 24 (i) 124 (j) 134 (k) 243 (l) 234 (m) 213 (n) 1324 (o) 4321

我的问题是针对CompletableFuture.anyOf。当其中一个进程完成后,另一个进程是在另一个thenRun运行后也完成完成,还是会提前终止?

java asynchronous completable-future
1个回答
1
投票

anyOf 只创建一个新的未来,允许安排其他操作,当至少有一个指定的未来被完成时执行。它不影响它的任何参数。

但请注意,主方法只用它来链接另一个操作,而不需要等待任何未来的完成。它只是执行另一个 doSomething(),这需要一个故意不指定的时间。然后 main 方法返回,在标准环境下,JVM检测到只有守护进程线程存在时就会终止。

由于这个JVM终止不关心任何后台操作,所以不能保证任何完成。原则上,甚至没有输出的可能。

但是链式操作定义了依赖关系,这些依赖关系是被服从的。

  1. 1 → 2. 因此,你永远不会看到一个 2 悄无声息 1 的输出中。而当这两个数字都存在时。1 必须在 2.
  2. (1 → 2 | 3) → 4. 如果你看到 4,至少其中之一 23 必须在那里,而且必须在 4. 当它 2,第一点也适用。但要注意的是,当两者。23,只需其中一个人到场即可。4所以 3412 将是一个有效的输出。

除了这些规则之外,顺序也可以是任意的,就像说的那样,不保证完成。你可以看到一个唯一的 1 或唯一 313 以任意的顺序。但是,正如上面所解释的,你不能看到一个唯一的 2 也不是唯一 4. 你可以通过每一个建议的答案,检查它是否违反了其中的一个依赖关系。如果没有,那就是一个可能的结果。

© www.soinside.com 2019 - 2024. All rights reserved.