可以看到这三个方法分别是睡眠10s、5s、15s,这就很好理解了syncMethod()方法中的写法是同步的,未达到异步的目的,切记调用完异步方法进接着调用get()方法不是异步的方式,而是同步的。
3、正确方式上面看了错误的用法,下面看正确的方式,
public String asyncMethod() throws InterruptedException, ExecutionException { Future<String> result1 = syncService.method1("I"); Future<String> result2 = syncService.method2("love"); Future<String> result3 = syncService.method3("async"); String str = result1.get(); String str2 = result2.get(); String str3 = result3.get(); String result = str + str2 + str3; return result; }这种方式是首先调用异步方法,然后分别调用get()方法,取得执行结果。下面看测试结果
2021-08-21 11:17:23.516 INFO 3248 --- [nio-8080-exec-1] com.atssg.controller.SyncController : start 2021-08-21 11:17:38.535 INFO 3248 --- [nio-8080-exec-1] com.atssg.controller.SyncController : str:Iloveasync执行时间未15s,这就很好解释了,异步层的三个方法,分别睡眠的时间是10s、5s、15s,既然是异步执行的,那么总的执行时间肯定是三个方法中最长的那个,符合测试结果。这才@Async正确的打开姿势。
三、异步执行@Async注解@Async注解的定义如下,
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Async { String value() default ""; }可以看到该注解可以用在类及方法上,用在类上表示类中的所有方法都是异步的,用在方法上表示该方法是异步的。
四、总结今天的文章分享到这里,主要分享了关于@Async注解在获取执行结果的时候的坑,一定要先调用异步方法,然后再调用get()方法,获取结果,其中get方法还有一个重载的,可以设置超时时间,即超过设置的超时时间便返回,不再等待,各位小伙伴可以自己试验。
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }下次继续分享有关@Async注解使用的一些小细节,欢迎持续关注。
推荐阅读
[springboot:异步调用@Async]: