Spring Boot 之异步调用Async

本文标题: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注解开启异步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值