Spring Boot (18) @Async异步

通常我们在某网站发送邮件验证码时,首先会提示验证码已发送,然而此时可能没有收到验证码,过几秒种才真正的收到。如果是同步会先验证发送是否成功然后再通知,如果是异步可以先通知用户已发送,并释放请求,然后再去异步处理。

 

@Async和@EnableAsync实现异步

控制层

    @GetMapping("/async")
    public String async() throws InterruptedException {
        myBatisService.task1();
        myBatisService.task2();
        System.out.print("释放请求");
        return "ok";
    }

 

服务层

    @Async
    public void task1() throws InterruptedException {
        Thread.sleep(2000L);
        System.out.print("完成任务1");
    }

    @Async
    public void task2() throws InterruptedException {
        Thread.sleep(2000L);
        System.out.print("完成任务2");
    }

 

同步:这是在一个控制层调用两个服务层的方法,任务1需要执行2秒时间,任务2又需要执行2秒时间,和普通方法的唯一区别就是异步方法上加了@Async

执行结果 显示输出完成任务1,然后是完成任务2,最后释放资源

 

如果要让@Async异步生效还需要在配置类中开启异步,

@EnableAsync
@SpringBootApplication
public class DemoApplication{
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }
}

 

再次执行,直接显示释放请求,然后是完成任务2和完成任务1 几乎是同时的。

 

这个异步实际上就是spring封装了一个基本的多线程功能,每个@Async都会开启一个新的线程,并且在内部使用了线程池。异步线程执行完以后并没有回调方法得知任务是否执行成功,在一般的web场景下,异步回调是在前端用ajax的方式来实现的,一个页面可以有多个ajax每个ajax去独立完成一个后台业务,谁先完成谁先响应,彼此互不干涉。后台业务则应该是彼此独立的以供ajax调用,如果在后台回调意味着多个业务任务整合到一个请求,而且这个请求的响应时间要按最慢那个任务计算。所以这种后台异步只适用于对请求结果实时性要求不高的场景,不建议在后台使用回调。

 

posted @ 2018-05-31 10:31  海盗船长  阅读(317)  评论(0)    收藏  举报