当前位置: 首页 > 知识库问答 >
问题:

Java不等待异步调用响应

唐俊楚
2023-03-14

我使用Java中的ExecutorService创建一个线程池,每个线程在其中执行一些异步任务/调用另一个服务。我不想等待回复,但无论何时回复都会返回。

ExecutorService executor = Executors.newFixedThreadPool(5);  // Class var

// Method
Future<Object> future = executor.submit(new TransportService(requestVO));
Object response = future.get(5, TimeUnit.SECONDS);  // blocking  

这样做将等待第一个请求完成,然后返回结果。问题是,第二个请求必须等待第一个请求的响应返回,并且只有在这之后才会被处理。如果我使用CompletableFuture的supplySync()方法,也会发生同样的情况,因为我还必须使用join()来获取响应。

我希望所有的请求都经过检查,并在收到时返回回复。这是可以实现的吗?流程仍然需要同步。

共有2个答案

司空鸣
2023-03-14

您需要在集合中添加期货,然后在最后调用加入/获取。

Collection<Future<Object>> futures = new ArrayList<>();
// schedule calls independantly
for(Request vo: requests) {
   futures.add(executor.submit(new TransportService(requestVO)));
}
// actually handle result
for(Future<Object> future: futures) {
   Object response = future.get(5, TimeUnit.SECONDS);
}

在这种情况下,您将安排多达五个作业。

陈茂
2023-03-14

您可能可以使用CompletableFuture将异步任务提供给ExecutorService

    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "foo", Executors.newSingleThreadExecutor());
    future.thenAccept(s -> System.out.println("done: " + s));

CompletableFuture有多个然后 链接完成后后续行动的方法。

 类似资料:
  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 给出一些关于我正在尝试做的细节:我正在用Java制作一个Minecraft插件。我有一个对象,它使用HashMap绑定到Minecraft的Player对象。 我在这个对象中有一个方法,类似于: 显然,会有很多事情发生,所以我希望这是异步发生的。计时器将在后台继续,它不会阻止代码中的任何其他内容。 对不起,如果我的问题太简单了,但我真的检查了网络和我是新的Java,所以原谅我的无知。

  • 我正试图将图像上传到firebase存储,但调用该函数时,未执行wait以获取url。我错过了什么? 看看这个其他主题,我发现问题可能是“然后”,但我如何设置代码以等待url? 异步/等待/然后飞镖/颤振 谢谢

  • 问题内容: 我知道这个问题以前曾被问过,但是所有解决方案都不适合我。 我有一个将参数发送到API的函数,并以列表的形式返回数据。我有一个UITableView设置为使用该列表,但是它在列表分配给变量之前运行。 码: 如果不立即将其作为重复投票,我将不胜感激,这是我尝试的方法。 派遣组 信号量计时 运行变量 其中包括= self和= self 。 编辑:要求提取项目, 问题答案: 您不能-也不应该-

  • 问题内容: 据我了解,在ES7 /ES2016中,将多个in放在代码中的工作方式类似于带有promise的链接,这意味着它们将一个接一个地执行而不是并行执行。因此,例如,我们有以下代码: 我是否正确理解仅在完成时才会调用?并行调用它们的最优雅方式是什么? 我想在Node中使用它,所以也许有一个异步库解决方案? 编辑:我对这个问题提供的解决方案不满意:减速是由于异步生成器中非并行等待Promise的