说我有办法
@RestController
@RequestMapping(value = "/")
public class AppController {
@Async
@PostMapping(value="/")
public CompletableFuture<> doSomething(@RequestBody ..., HTTPServletResponse response){
//something;
return completableResult;
}
}
我知道该方法将立即返回并释放容器线程。
但是如何处理返回的值(一段时间后)呢?
有听众吗?
这不会阻塞其中一个容器线程吗?
难道没有像future.get()这样的内部执行的东西吗?
2条答案
按热度按时间jbose2ul1#
有一个
doSomething.isDone()
方法来检查future是否准备好了。你可以实现if语句来检查isDone是否返回true(并调用.get()
方法来检索future所拥有的内容)。如果它返回false,则意味着你需要等待future。编辑:在帖子被编辑后,我的回答不再那么有联系了,但我会以类似的方式来做,因为我描述。
4smxwvx52#
我知道我迟到了,但对其他人来说,这可能是有帮助的。
首先是:
1.我看到您在同一个函数中同时使用了Async和CompletableFuture。它们用于执行相同的操作,即处理异步请求。
1.他们两个都能独立做同样的事情。
1.我不推荐使用isDone,因为您必须等待一段未知的时间才能返回值。我觉得最好让消费者(前端、浏览器或发出请求的任何人)等待响应。
使用@async
在这里,我们创建了一个CompletableFuture对象,并从async方法返回它。(浏览器或您来自前端的GET请求)将等待此对象完成。在我们完成异步任务(在另一个线程上运行)后,我们使用所需的CompletableFuture值完成cp对象,SpringBoot将你的CompletableFuture对象转换为该值的相关类型。
正在使用CompletableFuture
CompletableFuture API具有方法,runAsync和supplyAsync
1.异步运行:方法接受一个Runnablelambda函数。此方法用于在不同线程上计算异步任务,而不返回任何内容。
1.供应异步:方法接受一个Supplier类型的lambda函数并返回一个CompletableFuture。
我们可以使用supplyAsync方法返回completablefuture,并且在不同的线程中运行任务,而不使用@Async注解。
希望这能让关于CompletableFuture的事情变得更清楚。😋