所以早些时候我做了考试,有个问题。
问题5:异步编程(8点)
请考虑下面的程序。方法doSomething ( )可以运行一段不确定的时间。
导入java.util.concurrent.CompletableFuture;类CF {静态空doSomething() { ..}静态CompletableFuture printAsync(int i) {返回CompletableFuture.runAsync(() -> { doSomething();System.out.print(i);});}公共静态空洞主(string[] args) { CompletableFuture.anyof( printAsync(1) .thenRun(() -> printAsync(2)),printAsync(3) .thenRun(() -> printAsync(4));剂量();}
如果main正常运行,程序可能打印的输出是什么?
如果给定的输出是可行的,请用字符串yes填空。用字符串“否”填空,如果main将永远不会打印给定的输出。
请注意,这个问题将由一个机器人评分。因此,填写任何其他文本,如“不!”、“是的,因为……”、“永不!”等,都会导致答案被标记为错误,即使答案的意图是正确的。
(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运行之后完成还是提前终止?
发布于 2020-05-05 14:47:28
anyOf只创建一个新的未来,允许调度其他操作,以便在指定的期货中至少有一个已经完成时执行。它不影响它的任何论点。
但是请注意,main方法只使用它来链接另一个操作,而不等待任何未来的完成。它只执行另一个doSomething(),这需要一个有意不指定的时间。然后,main方法返回,在标准环境中,当它检测到只有守护进程线程存在时,JVM将终止。
因为这个JVM终止不关心任何后台操作,所以没有任何完成的保证。原则上,即使没有输出也是可能的。
但是,链式操作定义了依赖项,这些依赖项是服从的。
1 → 2.因此,您将永远不会在输出中看到没有1的1。当两个数字都存在时,1必须位于1之前。如果您看到4,至少2或3中必须有一个在那里,并且必须在4之前。当它是2时,第一点也适用。但是请注意,当2和3同时存在时,只需要其中一个位于4之前,因此3412将是一个有效的输出。除了这些规则之外,命令可以是任意的,而且,正如所说的,完成是没有保证的。您可以看到唯一的1或唯一的3,或1和3按任意顺序排列。但是,正如上面所解释的,您不能看到唯一的2或唯一的4。您可以查看每个建议的答案,并检查它是否违反了某个依赖项。如果没有,这是一个可能的结果。
https://stackoverflow.com/questions/61612672
复制相似问题