SpringBoot中异步方法的使用

news/2024/7/5 2:29:12
1. 使用CompletableFuture

实例如下:

@Autowired
@Resource(name = "threadPoolTaskExecutor")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;

@GetMapping
    public String testAsync() {
        CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(10000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("异步方法执行成功2, 线程名: " + Thread.currentThread().getName());
            return "异步方法执行成功";
            // 这里可传入值自定义的线程池, 否则是默认
        }, threadPoolTaskExecutor);
        return "success";
    }
2. 通过 @Async 注解

参数是 线程池对象名

这里直接在同一个类中是不行了, 错误方式如下:

// 这样还是一个同步方法
    @GetMapping
    public String testAsync() {
        test();
        return "success";
    }

    @Async("threadPoolTaskExecutor")
    public void test() {
        try {
            Thread.sleep(10000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("异步方法执行成功");
    }

// 这段代码中虽然使用了@Async注解来标记test方法,
// 但在testAsync方法中直接调用了test方法,而没有通过异步的方式调用。
// 在Spring框架中,@Async注解只能在其他bean方法内部被调用,
// 因为它通过创建一个代理对象来实现异步调用
正确方式1
  1. 定义一个共同的bean用来处理异步方法

    @Data
    @Component
    public class CommonAsyncComponent {
        
            @Async("threadPoolTaskExecutor")
        public void test() {
            try {
                Thread.sleep(10000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("异步方法执行成功");
        }
    
    }
    

    主方法中调用

        @Autowired
        private CommonAsyncComponent commonAsyncComponent;
        
        @GetMapping
        public String testAsync(){
            commonAsyncComponent.test();
            return "success";
        }
        
    
正确方式2

在server的实现类中直接使用**@Async**注解, 这样在控制层调用时就直接是异步方法

    @Override
    @Async("threadPoolTaskExecutor")
    public void test() {
        try {
            Thread.sleep(10000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("service异步方法执行成功");
    }
3. 使用Thread

这里是创建一个新的线程来执行, 而不是从线程池中直接获取, 但是存在一些问题

  1. 可维护性:直接创建线程可能导致代码可读性和可维护性降低,尤其是在复杂的应用中。
  2. 控制性差:线程的生命周期和资源管理需要手动处理,容易导致资源泄漏或线程安全问题。
  3. 可扩展性差:对于大规模应用,手动管理线程可能不是最优选择,因为它难以扩展和优化。
       new Thread(() -> {
       try {
            Thread.sleep(10000L);
       } catch (InterruptedException e) {
            e.printStackTrace();
       }
       System.out.println("controller异步方法执行成功");
       }).start();

http://lihuaxi.xjx100.cn/news/2008489.html

相关文章

wangEditor v4的简单使用

当前文档是 wangEditor v4 版本的。 wangEditor v5 已经正式发布,可参考文档。 v5 发布之后,v4 将不再开发新功能。 介绍 English documentation wangEditor4 —— 轻量级 web 富文本编辑器,配置方便,使用简单。 官网&#…

jupyter设置环境变量

要在Jupyter中设置环境变量,可以按照以下方法之一进行操作: 1. 在Jupyter Notebook中设置环境变量: - 打开Jupyter Notebook。 - 创建一个新的或打开一个已有的Jupyter Notebook。 - 在Notebook的代码单元格中,使用%env…

C++类和对象入门(二)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要…

程序员的悲哀:知名Python库requests作者失业了

在当今这个快速发展的科技时代,程序员作为创新的驱动力,一直被视为时代的宠儿。然而,即使在这样一个充满机会的领域,也有着不为人知的辛酸。近日,一个令人震惊的消息传遍了编程社区:知名Python库requests的…

Unity之第一人称角色控制

目录 第一人称角色控制 😴1、准备工作 📺2、鼠标控制摄像机视角 🎮3、角色控制 😃4.杂谈 第一人称角色控制 专栏Unity之动画和角色控制-CSDN博客的这一篇也有讲到角色控制器,是第三人称视角的,以小编…

【PTA浙大版《C语言程序设计(第4版)》编程题】练习7-4 找出不是两个数组共有的元素(附测试点)

目录 输入格式: 输出格式: 输入样例: 输出样例: 代码呈现 测试点 给定两个整型数组,本题要求找出不是两者共有的元素。 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数&a…

nodejs+vue企业公司设备维护报修管理系统6p9i9

为设计一个安全便捷,并且使用户更好获取工厂生产设备维护信息,本文主要有安全、简洁为理念,实现用户快捷寻找工厂生产设备维护信息,从而解决工厂生产设备维护信息复杂难辨的问题。该系统采用nodejs语言、vue框架和mysql数据库进行…

qt5-入门-信号槽理解+QMainWindow

参考: Qt 深入了解信号槽_w3cschool https://www.w3cschool.cn/learnroadqt/wz3t1j47.html Qt MainWindow_w3cschool https://www.w3cschool.cn/learnroadqt/uqjl1j4b.html 本地环境: win10专业版,64位 信号槽 最简单的例子:写一…