本文标题:Spring Boot 之异步调用Async
原始链接:
http://www.shuibo.cn/134.html
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
介绍
“何为异步调用?”
“日常中我们大多数业务都是同步调用,前端访问后端接口时,后端必须一步一步处理完成后返回给前端,前端渲染结果。那么异步调用指的就是前端访问后端接口时,后端可以先返回通知前端,比如:记录操作log这类与前端无关系的操作就可以通过异步调用,进而优化接口的返回速度”
为什么要用异步
为什么要用异步,我们先来看一下同步,假设一下的sleep()为某方法执行所需时间
1.同步
TestService.java
/**
* @Author: Bobby
* @Date: 2019/5/24 15:48
*/
@Component
public class TestService {
private final static Logger logger = LoggerFactory.getLogger(TestService.class);
/**
* 同步
* @throws InterruptedException
*/
public void synchroEvent() throws InterruptedException{
Thread.sleep(3000);
Thread.sleep(2000);
Thread.sleep(1000);
logger.info("同步方法执行完了");
}
}
TestController.java
/**
* 同步方法 等候6秒后返回
* @return
*/
@GetMapping("/synchroEvent")
public String test(){
long start = System.currentTimeMillis();
try {
testService.synchroEvent();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
logger.info("同步方法用时:{}",end-start);
return "成功";
}
运行结果:
cn.shuibo.service.TestService : 同步方法执行完了
cn.shuibo.controller.TestController : 同步方法用时:6007
2.异步
TestService.java
/**
* @Author: Bobby
* @Date: 2019/5/24 15:48
*/
@Component
public class TestService {
private final static Logger logger = LoggerFactory.getLogger(TestService.class);
/**
* 异步
* @throws InterruptedException
*/
@Async
public void asyncEvent() throws InterruptedException{
Thread.sleep(3000);
Thread.sleep(2000);
Thread.sleep(1000);
logger.info("异步方法执行完了");
}
}
TestController.java
/**
* 异步方法 即时返回(后台处理)
* @return
*/
@GetMapping("/asyncEvent")
public String test1(){
long start = System.currentTimeMillis();
try {
testService.asyncEvent();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
logger.info("异步方法用时:{}",end-start);
return "成功";
}
运行结果:
cn.shuibo.controller.TestController : 异步方法用时:0
过了6秒后:
cn.shuibo.service.TestService : 异步方法执行完了
总结
通过以上实践,同步与异步的区别,可以看出同步返回时间6秒左右,异步几乎0秒返回,同步是先执行完再返回的,异步是先返回后执行的。开启异步时记得在方法上添加
@Async
注解,Spring Boot启动类通过
@EnableAsync
注解开启异步。
版权声明:本文为youyuc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。