Async注解使用和CompletableFuture注解获取返回值

文章讨论了在面临接口调用超时限制时,如何通过使用Java的CompletableFuture进行异步处理来优化。当需要从多个源拉取数据且每个操作耗时较长时,使用CompletableFuture.allOf()方法可以并行执行任务,等待所有任务完成。耗时由最慢的任务决定。如果不使用allOf或获取返回值,主线程不会等待异步任务完成,避免阻塞。
摘要由CSDN通过智能技术生成

举栗个现实问题:
需求:拉取 业务数据不能超过 5秒。
拉取第三方数据 ,分别需要拉取 A业务数据(需要2秒) 、拉取 B业务数据(需要2秒)、拉取 C业务数据(需要2秒) ,最后再一并返回给前端。

问题:超时调用(项目要求每个接口不能超过 5秒 ),这时候就要多线程的使用了。
在这里插入图片描述
使用异步处理:
说明:@Async(“参数”) , 其中参数的意思是:指定使用哪一个线程池执行。
在这里插入图片描述
测试一下:
在这里插入图片描述
运行结果:
在这里插入图片描述
执行示意图:
在这里插入图片描述
因为异步标记了三个方法,所以看到主线程时间没被受影响,但是同时返回值也拿不到。
虽然耗时接近0秒, 但是返回给前端的数据就是 null了,这个问题该如何解决?
我们开始加入 CompletableFuture 的使用 。
对代码进行改造一下:
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述
执行简图:
在这里插入图片描述
为什么耗时是2秒,帮助理解:
CompletableFuture.allOf(a,b,c).join();
我们这里 allOf 传递了 三个 异步线程的返回值, 所以看到上图,也就出现了三个等待返回值的坑位 A B C。
耗时取决于这三个坑位中,最慢的那个。
试一下:
把pullDataA 改为等待8秒
在这里插入图片描述
运行结果:耗时 8秒
在这里插入图片描述
只要我想要某个异步线程的返回值,我就把这个方法返回接收值CompletableFuture 加入到 allOf 里面去 。
其实,只要使用到了 返回接收值CompletableFuture ,其实就已经开始触发,并不是一定要用allOf。

举例说明:
在这里插入图片描述
System.out.println(a.get()+b.get()+c.get());
里面也调用了get() ,也就是也算是使用了。

再举一个小例子:
在这里插入图片描述
这种情况,我们使用了 CompletableFuture分别去接收返回值,但是我们后面没去使用操作它们,也没使用allOf , 看下运行结果:
在这里插入图片描述
也就是说,这种情况,不会因为 我们使用了 CompletableFuture 而促使让主线程去等待任何异步线程,和主线程没有任何瓜葛。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值