Spring框架的@Async注解

目录

1. 核心注解:@Async

2. 基础使用示例

(1)启用异步支持

(2)定义异步方法

(3)调用异步方法

3. 高级配置

(1)自定义线程池

(2)指定线程池执行器

4. 返回值处理

(1)无返回值

(2)有返回值

5. 常见问题与解决

(1)异步方法不生效

(2)线程池配置无效

(3)异常处理

6. 适用场景

7.总结


Spring 框架中用于实现异步方法调用的注解是 @Async。这个注解允许方法在独立的线程中异步执行,从而避免阻塞主线程,提升系统吞吐量和响应速度。

1. 核心注解:@Async

  • 作用:标记一个方法为异步执行,Spring 会通过线程池启动新线程执行该方法。
  • 使用条件
    1. 在 Spring Boot 启动类或配置类上添加 @EnableAsync 启用异步支持。
    2. 异步方法必须定义在 Spring管理的Bean中(如 @Service@Component 注解的类)。
    3. 调用异步方法时,需通过 Spring代理对象调用(直接调用同类中的异步方法会失效)。(这一点和事务失效的一种情况有点相似)

2. 基础使用示例

(1)启用异步支持
@SpringBootApplication
@EnableAsync //启用异步支持
public class Application {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
(2)定义异步方法
@Service
public class MyService {@Async // 标记为异步方法public void asyncTask() {// 模拟耗时操作System.out.println("异步任务执行线程: " + Thread.currentThread().getName());}public void syncTask() {System.out.println("同步任务执行线程: " + Thread.currentThread().getName());}
}
(3)调用异步方法
@RestController
public class MyController {@Autowiredprivate MyService myService;@GetMapping("/test-async")public String testAsync() {myService.asyncTask(); //异步执行myService.syncTask();  //同步执行return "Check console logs!";}
}

输出结果

异步任务执行线程: task-1
同步任务执行线程: http-nio-8080-exec-1

3. 高级配置

(1)自定义线程池

默认情况下,Spring 使用 SimpleAsyncTaskExecutor(非池化线程),建议自定义线程池:

@Configuration
public class AsyncConfig {@Bean(name = "myTaskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix("MyAsyncThread-");executor.initialize();return executor;}
}
(2)指定线程池执行器
@Async("myTaskExecutor") // 指定使用自定义线程池
public void asyncTaskWithCustomPool() {//业务逻辑
}

4. 返回值处理

(1)无返回值

直接使用 void

@Async
public void asyncVoidMethod() { /* ... */ }
(2)有返回值

返回 FutureCompletableFuture

@Async
public Future<String> asyncFutureMethod() {return new AsyncResult<>("Task result");
}
@Async
public CompletableFuture<String> asyncCompletableFutureMethod() {return CompletableFuture.completedFuture("Task result");
}

调用示例

Future<String> future = myService.asyncFutureMethod();
String result = future.get(); // 阻塞等待结果

5. 常见问题与解决

(1)异步方法不生效
  • 原因:未启用 @EnableAsync,或方法未通过代理对象调用。
  • 解决
    • 确保启动类添加 @EnableAsync
    • 避免同类内部调用异步方法(如 this.asyncTask())。
(2)线程池配置无效
  • 原因:未正确注入自定义线程池。
  • 解决:检查 @Async("beanName") 中的 Bean 名称是否匹配。
(3)异常处理

异步方法默认不传播异常到调用方,需通过 AsyncUncaughtExceptionHandler 处理:

@Configuration
public class AsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {//返回自定义线程池}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (ex, method, params) -> {System.err.println("异步方法异常: " + method.getName());ex.printStackTrace();};}
}

6. 适用场景

  • 耗时操作:发送邮件、生成报表、调用外部 API。
  • 非关键路径任务:日志记录、数据缓存更新。
  • 高并发优化:减少请求响应时间,提升吞吐量。

7.总结

  • 核心注解@Async + @EnableAsync
  • 关键配置:自定义线程池、异常处理。
  • 注意事项:避免同类调用、合理控制线程池参数。

通过合理使用 @Async,可以显著提升 Spring 应用的并发处理能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34536.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发、科研、日常办公工具汇总(自用,持续更新)

主要记录汇总一下自己平常会用到的网站工具&#xff0c;方便查阅。 update&#xff1a;2025/2/11&#xff08;开发网站补一下&#xff09; update&#xff1a;2025/2/21&#xff08;补充一些AI工具&#xff0c;刚好在做AI视频相关工作&#xff09; update&#xff1a;2025/3/7&…

软件架构设计习题及复习

软件系统需求分析 系统需求模型转换为架构模型 软件架构设计 架构风格领域 难点 单选 平衡点是敏感点的一种&#xff0c;如果达到了平衡点一定要选平衡点&#xff0c;不能选敏感点添加层次不能提高系统性能&#xff0c;任何时候直接沟通性能最高效

ccf3501密码

//密码 #include<iostream> #include<cstring> using namespace std; int panduan(char a[]){int lstrlen(a);int s0;int zm0,sz0,t0;int b[26]{0},c[26]{0},d[10]{0},e0,f0;while(s<l&&l>6){if(a[s]<Z&&a[s]>A){b[a[s]-A];zm;}if(a[s…

【JavaEE进阶】Spring事务

目录 &#x1f343;前言 &#x1f334;事务简介 &#x1f6a9; 什么是事务? &#x1f6a9;为什么需要事务? &#x1f6a9;事务的操作 &#x1f340;Spring 中事务的实现 &#x1f6a9;Spring 编程式事务 &#x1f6a9;Spring声明式事务Transactional &#x1f6a9;T…

MySQL索引特性——会涉及索引的底层B+树

1 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有免…

给单片机生成字库的方案

Python 这段代码用来将txt文件中储存的字符串转变成二进制的像素数据 from PIL import Image, ImageFont, ImageDraw import osdef find_microsoft_yahei():"""Windows系统定位微软雅黑字体"""font_paths ["C:/Windows/Fonts/msyh.ttc&q…

01Spring Security框架

Spring Security是什么&#xff1f; Spring Security是⼀个提供身份验证、授权和针对常见攻击的保护的框架。 Spring Security做什么&#xff1f; 作为开发⼈员&#xff0c;在⽇常开发过程中需要⽤到Spring Security的场景⾮常多。事实上&#xff0c;对Web应⽤程序⽽⾔&#xf…

「BWAPP靶场通关记录(1)」A1注入漏洞

BWAPP通关秘籍&#xff08;1&#xff09;&#xff1a;A1 injection 1.HTML Injection - Reflected (GET)1.1Low1.2Medium1.3High 2.HTML Injection - Reflected (POST)2.1Low2.2Medium2.3High 3.HTML Injection - Reflected (URL)3.1Low3.2/3.3Medium/HIgh 4.HTML Injection - …

机器学习算法实战——敏感词检测(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 引言 随着互联网的快速发展&#xff0c;信息传播的速度和范围达到了前所未有的高度。然而&#xff0c;网络空间中也充斥着大量的…

Ollama+DeepSeek+NatCross内网穿透本地部署外网访问教程

目录 一、Ollama 简介 二、下载Ollama 三、下载并运行 DeepSeek 模型 四、运行 DeepSeek 模型 五、NatCross免费内网穿透 六、配置 ChatBox 连接 Ollama 七、外网使用ChatBox体验 一、Ollama 简介 Ollama 是一个开源的本地大模型部署工具&#xff0c;旨在让用户能够在个…

联想台式电脑启动项没有U盘

开机按F12&#xff0c;进入启动设备菜单&#xff0c;发现这里没有识别到插在主机的U盘&#xff1f; 解决方法 1、选上图的Enter Setup或者开机按F2&#xff0c;进入BIOS设置 选择Startup -> Primary Boot Sequence 2、选中“Excludeed from boot order”中U盘所在的一行 …

开源链动 2+1 模式 AI 智能名片 S2B2C 商城小程序助力社群发展中榜样影响力的提升

摘要&#xff1a;本文深入剖析了社群发展进程中榜样所承载的关键影响力&#xff0c;并对开源链动 21 模式 AI 智能名片 S2B2C 商城小程序在增强这一影响力方面所具备的潜力进行了全面探讨。通过对不同类型社群&#xff0c;如罗辑思维社群和 007 不出局社群中灵魂人物或意见领袖…

《交互式线性代数》

《交互式线性代数》 *Interactive Linear Algebra*由Dan Margalit和Joseph Rabinoff编写&#xff0c;是一本聚焦线性代数的教材。本书旨在教授线性代数的核心概念、方法及其应用&#xff0c;通过代数与几何相结合的方式&#xff0c;帮助读者深入理解线性代数的本质&#xff0c…

CSS -属性值的计算过程

目录 一、抛出两个问题1.如果我们学过优先级关系&#xff0c;那么请思考如下样式为何会生效2.如果我们学习过继承&#xff0c;那么可以知道color是可以被子元素继承使用的&#xff0c;那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…

生活中的可靠性小案例11:窗户把手断裂

窗户把手又断了&#xff0c;之前也断过一次&#xff0c;使用次数并没有特别多。上方的图是正常的把手状态&#xff0c;断的形状如下方图所示。 这种悬臂梁结构&#xff0c;没有一个良好的圆角过渡&#xff0c;导致应力集中。窗户的开关&#xff0c;对应的是把手的推拉&#xff…

怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题

在Mac上每次打开文件夹都会弹出一个新窗口的问题&#xff0c;可以通过以下方法解决‌ ‌调整Finder设置‌&#xff1a; 打开Finder&#xff0c;点击“Finder”菜单&#xff0c;选择“偏好设置”。在偏好设置中&#xff0c;选择“通用”标签。取消勾选“在标签页中打开文件夹”或…

HOT100——栈篇Leetcode739. 每日温度

文章目录 题目&#xff1a;Leetcode160. 相交链表原题链接思路代码 题目&#xff1a;Leetcode160. 相交链表 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温…

C++ 返回值优化(Return Value Optimization)

Intro 返回值优化(Return Value Optimization, RVO)是 C中的一种编译器优化技术, 它允许编译器在某些情况下省略临时对象的创建和复制/移动操作, 从而提高程序性能. RVO 主要应用于函数返回值的场景. 两种形式的 RVO 假定我们有这样一个类: class MyClass {std::string nam…

C++内存管理(复习)

1.动态申请多个某类型的空间并初始化 //动态申请10个int类型的空间并初始化为0到9int* p new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; delete[] p; //销毁 2.new/delete new:开空间构造函数 delete:析构函数释放空间 new和delete是用户进行动态内存申请和释放的操作符&#…

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称 CNNs&#xff09;是一种深度学习架构&#xff0c;专门用于处理具有网格结构的数据&#xff0c;如图像、视频等。它们在计算机视觉领域取得了巨大成功&#xff0c;成为图像分类、目标检测、图像分…