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

时间:2018-04-09 21:38:32

标签: java completable-future

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

但是如果我们没有CompletableFuture.get()调用来检索响应,我认为在代码中永远不会访问响应。从操作的角度来看,这是安全的吗?当我忽略CompletableFuture的回复时,是否有任何具体的警告/安全检查?

1 个答案:

答案 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"); 之间没有紧密关系。你的任务将包含在一项工作中,该工作将执行以下操作

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

    此处理不依赖于CompletableFutureget()的调用,也不依赖于您是否链接了任何相关操作。此外,一旦评估任务开始,无论您是否在未来致电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之前没有后台任务正在运行。