• 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调用,如果在后台回调意味着多个业务任务整合到一个请求,而且这个请求的响应时间要按最慢那个任务计算。所以这种后台异步只适用于对请求结果实时性要求不高的场景,不建议在后台使用回调。

  • 相关阅读:
    lintcode:Flip Bits 将整数A转换为B
    lintcode:strStr 字符串查找
    lintcode:Subtree 子树
    lintcode 容易题:Partition Array by Odd and Even 奇偶分割数组
    lintcode:在二叉查找树中插入节点
    lintcode:在O(1)时间复杂度删除链表节点
    lintcode:哈希函数
    lintcode:合并排序数组 II
    lintcode:合并排序数组
    lintcode:数飞机
  • 原文地址:https://www.cnblogs.com/baidawei/p/9115247.html
Copyright © 2020-2023  润新知