下面的例子取自Spring 的 Getting Started Creating Asynchronous Methods。
@Service
public class GitHubLookupService {
@Async
public CompletableFuture<User> findUser(String user) throws InterruptedException {
logger.info("Looking up " + user);
String url = String.format("https://api.github.com/users/%s", user);
User results = restTemplate.getForObject(url, User.class);
// Artificial delay of 1s for demonstration purposes
Thread.sleep(1000L);
return CompletableFuture.completedFuture(results);
}
}
AFAIK 我对计算机科学中异步方法的了解 -它应该立即返回。它应该是非阻塞的。
所以让我们在 Spring 的某个地方说我的代码findUser()
是这样调用的:
CompletableFuture<User> user = service.findUser("foo");
这实际上会阻塞。它会阻塞服务上的另一个线程,Executor
但由于 Thread.sleep(1000L)
. 正确的 ?
那么这个异步如何?
我的意思CompletableFuture
是要获得对未来将要完成的计算的引用。但是在这里,当我回到完整的未来时,计算已经结束,即。我们正在使用 CompletableFuture.completedFuture(results)
.
那么CompletableFuture
在这种情况下有什么意义呢?我的意思是,如果我要阻塞并仅在我的计算结束并且我得到结果时返回,我还不如只返回结果而不是 CompletableFuture
.
这真的是非阻塞/异步的吗?
我在这里发现的唯一非阻塞方面是卸载到不同的线程,仅此而已。
我在某个地方出错了吗?我错过了什么?
谢谢。