You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何异步方法未完成时,调用方已能获取Future对象引用?

问题解答

你遇到的核心原因是Spring的@Async依赖代理机制实现异步逻辑,而ExecutorService.submit()也是类似的提前创建并返回Future的设计,具体细节如下:

关于Spring @Async的场景

当你在测试类中调用helloFuture()时,实际执行的并不是Service类中定义的原方法,而是Spring动态生成的代理类的方法:

  1. 代理方法会先在调用线程(也就是测试的主线程)中创建一个CompletableFuture对象;
  2. 接着把Service类中helloFuture()的实际逻辑(包括打印日志、休眠、返回completedFuture的代码)包装成异步任务,提交到Spring的异步线程池;
  3. 代理方法立刻把提前创建好的CompletableFuture返回给调用方,也就是测试方法里的future变量。

而原Service类中的helloFuture()代码是在异步线程中执行的,当它执行到return CompletableFuture.completedFuture("done")时,实际是把这个结果同步到代理提前返回的那个CompletableFuture中,此时调用方调用future.get()就能获取到最终结果。

关于ExecutorService.submit的场景

你的推测是正确的,ExecutorService.submit()的逻辑本质和@Async代理一致:

  1. 调用submit()时,方法会先在当前线程创建一个FutureTask(实现了Future接口),将你提交的任务(Callable/Runnable)封装进去;
  2. 把FutureTask加入线程池的任务队列,等待工作线程执行;
  3. 立刻将这个FutureTask返回给调用方。

任务的实际执行是在线程池的工作线程中进行的,当任务完成后,FutureTask会存储执行结果(或异常),调用方通过get()方法就能读取到这些数据。


内容的提问来源于stack exchange,提问作者Abe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:05:03