Spring Boot 之异步调用Async

  • Post author:
  • Post category:其他




本文标题: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 版权协议,转载请附上原文出处链接和本声明。