@Async的使用说明
在 Spring Boot 中,@Async 注解用于实现异步方法调用,允许方法在单独的线程中执行,从而避免阻塞主线程,提升应用的并发处理能力。
1. 基本用法
在 Spring Boot 中使用 @Async 很简单,主要步骤如下:
步骤 1:启用异步支持
首先,需要在 Spring Boot 应用程序的启动类或配置类上加上 @EnableAsync 注解,以启用异步方法的支持。
@SpringBootApplication
@EnableAsync
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
步骤 2:定义异步方法
然后,在需要异步执行的方法上加上 @Async 注解。注意,异步方法需要返回 void 或 Future 类型(如 CompletableFuture)。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;@Service
public class AsyncService {@Asyncpublic void asyncMethod() {// 模拟耗时操作try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("异步方法执行完成");}@Asyncpublic CompletableFuture<String> asyncMethodWithReturn() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return CompletableFuture.completedFuture("异步方法带返回值执行完成");}
}
步骤 3:调用异步方法
当调用 @Async 注解的方法时,方法将会在独立的线程中执行,不会阻塞调用它的线程。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CompletableFuture;@RestController
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/async")public String callAsyncMethod() {asyncService.asyncMethod();return "调用了异步方法";}@GetMapping("/async-with-return")public CompletableFuture<String> callAsyncMethodWithReturn() {return asyncService.asyncMethodWithReturn();}
}
2. 自定义线程池
默认情况下,Spring 使用 SimpleAsyncTaskExecutor 来处理异步任务,但你可以自定义线程池来管理这些任务。
自定义线程池配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
@EnableAsync
public class AsyncConfig {@Bean(name = "asyncExecutor")public Executor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);executor.setThreadNamePrefix("AsyncThread-");executor.initialize();return executor;}
}
然后,在异步方法上指定使用这个线程池:
@Async("asyncExecutor")
public void asyncMethod() {// 方法实现
}
3. 异步方法的限制
- 异步方法不能是
private方法,因为 Spring 需要通过代理对象来处理异步调用。 - 异步方法必须通过代理对象调用,不能直接在同一个类内部调用,否则
@Async不会生效。
4. 异步方法异常处理
对于返回 Future 或 CompletableFuture 的异步方法,可以通过 .exceptionally() 或 .handle() 方法处理异常:
@Async
public CompletableFuture<String> asyncMethodWithException() {return CompletableFuture.supplyAsync(() -> {if (true) {throw new RuntimeException("异常发生");}return "成功";}).exceptionally(ex -> "处理异常: " + ex.getMessage());
}
对于 void 类型的异步方法,可以使用 AsyncUncaughtExceptionHandler 处理未捕获的异常:
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;import java.lang.reflect.Method;@Configuration
public class AsyncExceptionHandler implements AsyncConfigurer {@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return new AsyncUncaughtExceptionHandler() {@Overridepublic void handleUncaughtException(Throwable ex, Method method, Object... params) {System.out.println("异步方法出现未捕获异常: " + ex.getMessage());}};}
}
总结
@Async 注解为 Spring Boot 提供了非常简洁的异步调用支持,能有效提升应用的并发处理能力。通过自定义线程池和异常处理机制,还可以更好地控制异步任务的执行与监控。
相关文章:
@Async的使用说明
在 Spring Boot 中,Async 注解用于实现异步方法调用,允许方法在单独的线程中执行,从而避免阻塞主线程,提升应用的并发处理能力。 1. 基本用法 在 Spring Boot 中使用 Async 很简单,主要步骤如下: 步骤 1…...
经验笔记:SQL调优
SQL调优经验笔记 引言 SQL调优是确保数据库系统高效运行的重要环节。通过对查询语句、数据库配置、硬件资源等方面进行优化,可以显著提升数据库性能,进而增强应用程序的整体表现。以下是基于常见调优手段和实践经验整理的一份经验笔记。 1. 查询语句优…...
Selenium使用浏览器用户配置进行测试
本文主要介绍了如何在使用Selenium WebDriver进行自动化测试时,创建和使用自定义的Firefox配置文件。 什么是Firefox配置文件? Firefox会将用户的个人信息,如书签、密码和用户偏好设置存储在一个称为配置文件的文件集合中,这些文…...
virsh命令的使用
virsh 是一个用于管理虚拟机的命令行工具,它与 libvirt 服务配合使用,支持对虚拟机的创建、配置、启动、停止等操作。 1、列出虚拟机 列出正在运行的虚拟机: virsh list列出所有虚拟机(包括未启动的): …...
【来学Vue吧】创建一个Vue项目
🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。 首先需要配置Vue环境…...
C#迭代器方法和yield用法
一.迭代器方法介绍 可使用foreach循环进行遍历的方法,称为迭代器方法。 迭代器方法使用yield return语句返回元素。 到达yield return语句时,会记住当前在代码中的位置。 下次调用迭代器函数时,将从该位置开始执行。换言之,如果…...
斗破C++编程入门系列之二十六:数组、指针和字符串:动态内存分配和释放(一星斗师)
斗破C目录: 斗破C编程入门系列之前言(斗之气三段) 斗破C编程入门系列之二:Qt的使用介绍(斗之气三段) 斗破C编程入门系列之三:数据结构(斗之气三段) 斗破C编程入门系列之…...
Servlet 和 Spring Boot 的请求处理流程区别和例子
当然可以为您绘制一个流程图,展示 Servlet 和 Spring Boot 的请求处理流程。这将帮助我们更直观地比较两者的工作方式。 #mermaid-svg-PgFEmecUmDhvxxtQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-P…...
C++笔记之map的实用操作
C++笔记之map的实用操作 文章目录 C++笔记之map的实用操作1.初始化1.1.使用列表初始化1.2.使用 `insert` 方法1.3.使用 `emplace` 方法1.4.复制构造1.5.移动构造2.赋值2.1.列表赋值2.2.插入元素2.3.批量插入3.取值3.1.使用 `[]` 操作符3.2.使用 `at()` 方法3.3.检查键是否存在3…...
Lombok失效:报错 找不到符号 Springboot项目
错误原因,Springboot项目为Lombok提供了版本管理的支持,所以引入Lombok依赖的时候,无需手动指定版本,手动指定了可能会导致依赖冲突。 去掉手动指定的版本,问题解决...
Linux 基础命令-文件与目录操作
在 Linux 操作系统中,文件和目录是组织和管理数据的核心单元。作为一个命令行驱动的操作系统,Linux 提供了一系列强大且灵活的命令来操作文件和目录。掌握这些命令不仅是管理 Linux 系统的基础,也是高效使用 Linux 环境的关键。 一、文件与目…...
Delphi 12.1安卓APP开发中获取硬件信息及手机号
Demo与代码已上传到CSDN下载。 这里简单说一下代码内容,完整代码请自行下载,不清楚的欢迎留言交流。 前言 演示Demo使用了我自己开发的一个控件,TLayoutPro 《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载控…...
STM32 - 笔记4
1 STM32 示波器 基于STM32的简易示波器项目(含代码)——HAL库_stm32简易示波器 基于STM32的简易示波器项目(含代码)——HAL库_stm32简易示波器_stm32示波器-CSDN博客 【强烈推荐】基于stm32的OLED各种显示实现(含动态图)_stm32oled以十六进制显示-CSDN博客 STM32示波器…...
【H2O2|全栈】更多关于HTML(1)HTML进阶(一)
目录 HTML进阶知识 前言 准备工作 标签的扩展(一) 本文中的标签在什么位置使用? title标签 meta标签 name viewport referrer http-equiv charset content link标签 实际案例 可视部分 代码分析 其他标签 base标签 styl…...
新160个crackme - 053-devilz KeyGen me#3
运行分析 解压出来4个文件运行程序发现要破解Name和Serial PE分析 32位,petite壳 手动脱壳 使用windows XP虚拟机OD打开程序按2下F8,发现ESP变红,根据ESP定律,在该地址右键 -> HW break下断点 继续按2下F9,来到灰色…...
ORA-12514
第一步,去这个地址,查查你的服务名是否存在 第二步,没查到就是你服务名写错了,查到了就退出我的解答...
MyBatis-PlusDruid数据源
MyBatis-Plus简介 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上进行了增强而不改变其原有的功能,旨在简化开发、提高效率。以下是对MyBatis-Plus的详细简介: 一、基本概述 定义:MyBat…...
C#中chart绘制曲线
官网资料:Chart 类 (System.Windows.Forms.DataVisualization.Charting) | Microsoft Learn 类的 Chart 两个重要属性是 Series 和 ChartAreas 属性,这两个属性都是集合属性。 Series集合属性存储Series对象,这些对象用于存储要显示的数据以…...
c++数据结构算法题讲解
那么从本期文章开始,会尽量带大家一起刷题 第一题 题目 关键词 思路 源代码 class MinStack { public: void push(int val) { _st.push(val); if(_minst.empty() || val < _minst.top()) { _minst.push(val); } } void pop() { if(_st.top() _minst.top()) {…...
间隙锁在其他数据库管理系统中的类似实现
间隙锁在其他数据库管理系统中的类似实现 一、引言 在 MySQL 中,间隙锁在可重复读事务隔离级别下起到了防止幻读的重要作用。那么在其他数据库管理系统中,是否也有类似的机制来实现类似的功能呢?了解其他数据库管理系统中与间隙锁类似的实现,可以帮助我们更好地理解不同数…...
Polar Sparsity技术:提升LLM推理效率的动态稀疏优化
1. 项目概述:Polar Sparsity技术背景与核心价值 在大型语言模型(LLM)推理任务中,计算效率始终是制约实际部署的关键瓶颈。传统稀疏化方法(如权重剪枝或神经元激活稀疏化)虽然在小批量场景下有效,…...
Python爬虫中如何正确配置住宅IP代理?新手避坑指南
很多人买完住宅IP,配置半天还是报错、被封。本文手把手教你用Python正确接入住宅代理,附代码和常见问题解决。一、为什么你的代理配置总失败?常见的几种错误:协议用错:服务商给的SOCKS5,你却按HTTP方式配认…...
【Elasticsearch从入门到精通】第10篇:Elasticsearch REST API最佳实践——Content-Type、模糊性与访问控制
上一篇【第09篇】Elasticsearch API规范详解——多索引、日期数学与通用选项 下一篇【第11篇】Elasticsearch索引API详解——索引创建、删除与别名管理(明日更新,敬请期待) 摘要 掌握Elasticsearch REST API的使用规范不仅能避免常见错误&am…...
Unity UGUI Mask与3D对象Stencil裁剪失效的根因解析
1. 这不是“Stencil失效”,而是 Unity 渲染管线里一场被忽略的层级静默冲突 你有没有试过在 UGUI ScrollView 里放一个带 Mask 的滚动区域,再把一个 3D 模型(比如一个带透明材质的粒子特效、或者一个半透的 UI 面板)叠在它上面&am…...
非科班本科,3年从零基础到AI工程师,我的真实转行之路(附避坑指南)
大家好,我是一名普通的非科班本科生,专业是机械制造及自动化,如今已经在AI行业深耕3年,成为了一名能独当一面的AI工程师,还参与过OpenClaw、DeerFlow等国际开源项目,算是真正从“AI小白”逆袭成了行业从业者。 写这篇文章,不是为了炫耀,而是因为我太懂那种“想转行AI却…...
av1编码--比特流结构
目录 2.2.1 序列头信息 2.2.2 帧头信息 2.2.4 时间分隔符信息 2.2.5 切片组信息 AV1 比特流是由一系列名为开放比特流单元(OBU)的数据单元组成。每个 OBU 由一个可变长度的字节串(Byte String)组成。具体来讲,OBU 包…...
好用的长沙装修设计值得选的服务商
在装修设计领域,选择一家靠谱的服务商至关重要。长沙互知空间设计工作室,也就是长沙互知建筑设计有限公司,便是众多客户值得信赖的选择。下面将从几个方面详细分析它的优势,并与其他知名品牌进行对比,为大家提供一些实…...
紫光同创FPGA网络摄像头方案选型指南:OV7725 vs OV5640,YT8531 vs KSZ9031怎么选?
紫光同创FPGA网络摄像头方案选型指南:OV7725 vs OV5640,YT8531 vs KSZ9031深度解析 在工业视觉和安防监控领域,FPGA因其并行处理能力和低延迟特性,成为实时视频采集与传输的理想选择。紫光同创作为国产FPGA的重要代表,…...
小红书内容管理困境与XHS-Downloader的优雅解决方案
小红书内容管理困境与XHS-Downloader的优雅解决方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接;采集小…...
告别代码阅读障碍:MultiHighlight智能高亮插件提升3倍开发效率
告别代码阅读障碍:MultiHighlight智能高亮插件提升3倍开发效率 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors 🎨💡 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight …...
