CompletableFuture调用两次get时supplyAsync部分是否会重复执行?
结论
不会触发两次外部HTTP接口调用,CompletableFuture的运行逻辑和get方法的调用次数、超时设置完全无关。
具体运行规则说明
- 任务启动时机:
CompletableFuture.supplyAsync(...)这行代码执行完成的瞬间,你写在lambda里的HTTP调用逻辑就已经被提交到异步线程池开始执行,不需要等待get方法被调用才启动。 get方法的本质:get只负责阻塞等待当前异步任务的执行结果,本身不会触发任务重新执行。无论你调用多少次get、每次设置的超时时间差异多大,都是等待同一个异步任务的结果。- 超时场景的特殊说明:如果第一次
get设置的超时时间太短,抛出TimeoutException,只是当前等待的线程终止等待,正在跑的HTTP调用任务不会被中断。第二次调用get时,如果任务已经执行完成,会直接返回缓存的结果;如果还在执行,会按照第二次设置的超时时间继续等待。
验证方法
你可以在lambda内部加一行打印日志,测试多次调用get的场景,会发现日志只会输出一次,足以证明HTTP调用只会执行一次。
注意:只有每次调用
supplyAsync生成新的CompletableFuture实例时,才会触发新的HTTP接口调用。
内容的提问来源于stack exchange,提问作者Teddy Dong
相关产品推荐
相关产品推荐

