介绍

“何为异步调用?”
“日常中我们大多数业务都是同步调用,前端访问后端接口时,后端必须一步一步处理完成后返回给前端,前端渲染结果。那么异步调用指的就是前端访问后端接口时,后端可以先返回通知前端,比如:记录操作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注解开启异步。

   
     
本文作者:      
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
扫码关注不迷路!

发表评论

电子邮件地址不会被公开。 必填项已用*标注