gpt4 book ai didi

java - 当 CompletableFuture 的响应被忽略时会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:33 25 4
gpt4 key购买 nike

我正在尝试 CompletableFuture制作中async API 调用。我试图理解忽略 Future 的响应的含义。 。从技术上讲,JVM 执行异步 API 调用并返回结果。

但万一我们没有CompletableFuture.get()调用来检索响应,我假设响应永远不会在代码中被访问。从操作的角度来看,这安全吗?当我忽略 CompletableFuture 的响应时,是否有任何我应该注意的具体警告/安全检查?

最佳答案

计划任务和CompletableFuture之间没有紧密的关系。您的任务将包含在一个作业中,该作业将执行以下操作

  1. 检查CompletableFuture是否尚未完成。如果没有,请继续
  2. 执行任务
  3. 尝试用结果完成CompletableFuture

此处理不依赖于 get()join() 的调用,也不依赖于您是否链接任何依赖操作。此外,一旦任务的评估开始,无论您对 future 调用 cancel 还是 complete ,评估都会继续,并且当 future 已经完成时,只有最后一步的最终完成尝试不会执行任何操作。

换句话说,例如的逻辑runAsync,类似于

public static CompletableFuture<Void> runAsync(Runnable r) {
CompletableFuture<Void> future = new CompletableFuture<>();
ForkJoinPool.commonPool().execute(
(Runnable&CompletableFuture.AsynchronousCompletionTask)() -> {
if(!future.isDone()) try {
r.run();
future.complete(null);
}
catch(Throwable t) {
future.completeExceptionally(t);
}
});
return future;
}

CompletableFuture 实例只是一个对象。如果您不保留对它的引用,则尝试完成的代码将拥有一个引用,直到进行尝试为止。

请注意,默认执行程序 ForkJoinPool.commonPool() 使用守护线程。因此,当您在主线程中提交任务而不等待其完成并且 JVM 中没有留下非守护线程时,它将终止而不等待完成。如果这些任务执行外界可见的操作,例如写入文件时,您可能希望确保其完成,因此可以调用 awaitQuiescence以确保在关闭 JVM 之前没有后台任务正在运行。

关于java - 当 CompletableFuture 的响应被忽略时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49742073/

25 4 0