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)等

相关推荐
leobertlan6 小时前
2025年终总结
前端·后端·程序员
面向Google编程6 小时前
从零学习Kafka:数据存储
后端·kafka
易安说AI7 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI7 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI7 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
JH30738 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
颜酱8 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_9 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble9 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟9 小时前
使用ASM和agent监控属性变化
java