springboot中@Async的简单用法

springboot中@Async的简单用法

文章目录

开启配置

在配置文件或者入口文件上新增注解: @EnableAsync即可

@Async的使用

对应需要异步调用的方法上添加@Async注解即可

无返回值调用

controller代码

java 复制代码
    @RequestMapping("test1")
    public String test1() {
        System.out.println("controller1调用开始");
        testService.test1();
        System.out.println("controller1调用结束");
        return "success test1";
    }

service代码

java 复制代码
    @Async
    public void test1() {
        System.out.println("service1调用开始");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("service1调用结束");
    }

运行结果

复制代码
controller1调用开始
controller1调用结束
service1调用开始
service1调用结束

可以看到service的已异步调用

带返回值的调用

如果需要执行耗时操作, 又想在结束后执行如发送通知或者保存数据库等方法时, 我们就可以使用带返回值的调用方法

如果需要返回, 则类型需为Future的子类, 最好是返回 CompletableFuture, 里面提供了更多的扩展

controller代码

java 复制代码
    @RequestMapping("test2")
    public String test2() {
        System.out.println("controller2调用开始");
        CompletableFuture<String> stringCompletableFuture = testService.test2();
        stringCompletableFuture.whenComplete((s, throwable) -> {
           if (throwable != null) {
               System.out.println("出现异常: " + throwable.getLocalizedMessage());
               return;
           }
           if (StringUtils.hasText(s)) {
               // todo 此处可以进行发通知/写入数据库等操作
               System.out.println("service2返回值: " + s);
           }
        });
        System.out.println("controller2调用结束");
        return "success test2";
    }

service代码

java 复制代码
    @Async
    public CompletableFuture<String> test2() {
        System.out.println("service2调用开始");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("service2调用结束");
        return CompletableFuture.completedFuture("成功执行");
    }

运行结果(未生效请重启应用)

复制代码
controller2调用开始
service2调用开始
controller2调用结束
service2调用结束
service2返回值: 成功执行

可以看到service的在异步调用结束后, 执行了 whenComplete里面的内容

如果需要在controlle里面同步执行service, 则调用CompletableFuture.get方法即可

controller代码

java 复制代码
    // service代码不变
    @RequestMapping("test3")
    public String test3() throws ExecutionException, InterruptedException {
        System.out.println("controller3调用开始");
        CompletableFuture<String> stringCompletableFuture = testService.test2();
        String s = stringCompletableFuture.get();
        System.out.println("controller3调用结束, 返回值: " + s);
        return "success test3";
    }

运行结果

复制代码
controller3调用开始
service2调用开始
service2调用结束
controller3调用结束, 返回值: 成功执行

可以看到controller已阻塞等待执行结果, 源码注释也可看出

更多功能请参考CompletableFuture接口, 比如同时调用n个@Async接口并任一执行成功后返回(anyOf)/全部执行成功后返回(allOf)等

相关推荐
用户6120414922133 分钟前
C语言做的物联网设备数据采集模拟器
c语言·后端·敏捷开发
漫漫不慢.17 分钟前
算法练习-二分查找
java·开发语言·算法
还是鼠鼠25 分钟前
《黑马商城》Elasticsearch基础-详细介绍【简单易懂注释版】
java·spring boot·spring·elasticsearch·搜索引擎·spring cloud·全文检索
牧羊人_myr40 分钟前
Maven核心功能与项目构建详解
java·maven
华仔啊1 小时前
千万级大表如何新增字段?别再直接 ALTER 了
后端·mysql
IT_陈寒1 小时前
Python开发者必看!10个高效数据处理技巧让你的Pandas代码提速300%
前端·人工智能·后端
量子物理学1 小时前
Eclipse Mosquitto 在小内存下怎么修改配置文件
java·服务器·eclipse
程序员鱼皮1 小时前
让老弟做个数据同步,结果踩了 7 个大坑!
java·后端·计算机·程序员·编程·职场
麦兜*1 小时前
Redis 7.2 新特性实战:Client-Side Caching(客户端缓存)如何大幅降低延迟?
数据库·spring boot·redis·spring·spring cloud·缓存·tomcat
Iris7611 小时前
MyBatis一对多关系映射方式
java