我正在尝试CompletableFuture
进行async API调用。我试图理解忽略Future
的回应的含义。 JVM在技术上执行异步API调用并返回结果。
但是如果我们没有CompletableFuture.get()
调用来检索响应,我认为在代码中永远不会访问响应。从操作的角度来看,这是安全的吗?当我忽略CompletableFuture
的回复时,是否有任何具体的警告/安全检查?
答案 0 :(得分:0)
计划任务与$id_trilho = 0;
$result = array();
array_push($result,array("id_trilho"=>$id_trilho));
echo json_encode($result);
// output [{"id_trilho":0}]
// then use JSONArray jsonArray = new JSONArray(response);
// JSONObject jsonObject1 = jsonArray.getJSONObject(0);
// String id = jsonObject1.getString("id_trilho");
之间没有紧密关系。你的任务将包含在一项工作中,该工作将执行以下操作
CompletableFuture
是否尚未完成。如果没有,请继续CompletableFuture
醇>
此处理不依赖于CompletableFuture
或get()
的调用,也不依赖于您是否链接了任何相关操作。此外,一旦评估任务开始,无论您是否在未来致电join()
或cancel
,评估将继续,并且只有最后一步的最终完成尝试将是未来已经完成时什么都不做。
换句话说,例如, complete
,类似于
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
使用守护程序线程。因此,当您在主线程中提交任务而不等待它们完成并且JVM中没有留下非守护程序线程时,它将终止而不等待完成。如果这些任务执行外部世界可见的动作,例如写入文件时,您可能希望确保它们完成,因此可以调用awaitQuiescence
以确保在关闭JVM之前没有后台任务正在运行。