@Async异步线程:Spring 自带的异步解决方案
前言在项目应用中使用MQ异步调用来实现系统性能优化完成服务间数据同步是常用的技术手段。如果是在同一台服务器内部不涉及到分布式系统单纯的想实现部分业务的异步执行这里介绍一个更简单的异步方法调用。对于异步方法调用从Spring3 开始提供了Async 注解该注解可以被标注在方法上以便异步地调用该方法。调用者将在调用时立即返回而方法的实际执行将提交给 Spring TaskExecutor 的任务中由指定的线程池中的线程执行。正文一、Spring线程池的分类以下是官方已经实现的常见的5个TaskExecuter。Spring 宣称对于任何场景这些TaskExecuter完全够用了:线程特点SimpleAsyncTaskExecutor每次请求新开线程没有最大线程数设置.不是真的线程池这个类不重用线程每次调用都会创建一个新的线程SyncTaskExecutor不是异步的线程。同步可以用SyncTaskExecutor但这个可以说不算一个线程池因为还在原线程执行。这个类没有实现异步调用只是一个同步操作。ConcurrentTaskExecutorExecutor的适配类不推荐使用。如果ThreadPoolTaskExecutor不满足要求时才用考虑使用这个类。SimpleThreadPoolTaskExecutor是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用才需要使用此类。ThreadPoolTaskExecutor最常使用推荐是阿里巴巴Java开发规范中指定的线程类要求jdk版本大于等于5。其实质是对java.util.concurrent.ThreadPoolExecutor 的包装。参考阿里巴巴java开发规范 在线程池应用中线程池不允许使用Executors去创建也不允许使用系统默认的线程池推荐通过ThreadPoolExecutor的方式这样的处理方式让开发的工程师更加明确线程池的运行规则规避资源耗尽的风险。二、SpringBoot中使用Async使用异步线程调用方法过程如下编写配置类定义线程池启动类/配置文件上加上注解EnableAsync方法上加上注解Async下面演示案例中我本地项目的目录仅供参考2.1 启用Async关键注解 EnableAsync 可以加载启动类上也可以加在配置文件上效果是一样的。方式一基于Springboot启动类启用EnableAsyncSpringBootApplicationpublic class AsyncApplication {public static void main(String[] args) {SpringApplication.run(AsyncApplication.class, args);}}方式二基于Java配置的启用// com.example.async.service 为即将开启异步线程业务的包位置后面有详细讲解EnableAsyncConfigurationComponentScan(com.example.async.service)public class AsyncConfiguration implements AsyncConfigurer {Overridepublic Executor getAsyncExecutor() {return executor();}...}2.2 Async与线程池Spring应用默认的线程池指在Async注解在使用时不指定线程池的名称。查看源码Async的默认线程池为SimpleAsyncTaskExecutor。Slf4j Service public class BusinessServiceImpl implements BusinessService { /** * 方法4没有指定线程池验证默认线程池也ok不推荐规避资源耗尽的风险 */ Async public void asyncDemo4() { log.info(asyncDemo4 Thread.currentThread().getName() 正在执行 ----------); try { Thread.sleep(2*1000); } catch (InterruptedException e) { e.printStackTrace(); } log.info(asyncDemo4 Thread.currentThread().getName() 执行结束); } }2.3 Async自定义线程池自定义线程池可对系统中线程池更加细粒度的控制方便调整线程池大小配置线程执行异常控制和处理。在设置系统自定义线程池代替默认线程池时虽可通过多种模式设置但替换默认线程池最终产生的线程池有且只能设置一个不能设置多个类继承AsyncConfigurer。重新实现接口AsyncConfigurer继承AsyncConfigurerSupport配置由自定义的TaskExecutor替代内置的任务执行器三者使用方式大体相同下面的案例将展示说明其一实现接口AsyncConfigurer接口的方式。配置一个线程池 ThreadPoolTaskExecutor/*** com.example.async.service即将开启异步线程的业务方法是哪个** 解释* 1.即将开启异步线程业务的包位置com.example.async.service* 2.通过 ThreadPoolExecutor 的方式规避资源耗尽的风险*/EnableAsyncConfigurationComponentScan(com.example.async.service)public class AsyncConfiguration implements AsyncConfigurer {Overridepublic Executor getAsyncExecutor() {return executor();}/*** 执行需要依赖线程池这里就来配置一个线程池* 1.当池子大小小于corePoolSize就新建线程并处理请求* 2.当池子大小等于corePoolSize把请求放入workQueue(QueueCapacity)中池子里的空闲线程就去workQueue中取任务并处理* 3.当workQueue放不下任务时就新建线程入池并处理请求如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理* 4.当池子的线程数大于corePoolSize时多余的线程会等待keepAliveTime长时间如果无请求可处理就自行销毁*/Bean(asyncExecutor)public ThreadPoolTaskExecutor executor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();//设置线程名executor.setThreadNamePrefix(async-method-execute-);//设置核心线程数executor.setCorePoolSize(10);//设置最大线程数executor.setMaxPoolSize(50);//线程池所使用的缓冲队列executor.setQueueCapacity(100);//设置多余线程等待的时间单位秒executor.setKeepAliveSeconds(10);// 初始化线程executor.initialize();return executor;}}执行异步线程方法指定线程池value 要与配置类 Bean() 中的name相同/*** 异步线程 - 执行业务* 注意* 1.Async 注解调用用线程池不指定的话默认SimpleAsyncTaskExecutor* 2.SimpleAsyncTaskExecutor 不是真的线程池这个类不重用线程默认每次调用都会创建一个新的线程*/Slf4jServicepublic class AsyncServiceImpl implements AsyncService {/*** 方法1Async 标注为异步任务执行此方法的时候会单独开启线程来执行不影响主线程的执行*/Async(asyncExecutor)public void asyncDemo1() {log.info(asyncDemo1 Thread.currentThread().getName() 正在执行 ----------);// 故意等10秒那么异步线程开起来这样明显看到方法2不用等方法1执行完就调用了try {Thread.sleep(10*1000);} catch (InterruptedException e) {e.printStackTrace();}log.info(asyncDemo1 Thread.currentThread().getName() 执行结束);}/*** 方法2与方法1一起执行证明2个线程异步执行互不干扰*/Async(asyncExecutor)public void asyncDemo2() {log.info(asyncDemo2 Thread.currentThread().getName() 正在执行 ----------);try {Thread.sleep(5*1000);} catch (InterruptedException e) {e.printStackTrace();}log.info(asyncDemo2 Thread.currentThread().getName() 执行结束);}/*** 方法3没有指定线程池验证默认线程池也ok不推荐规避资源耗尽的风险*/Asyncpublic void asyncDemo3() {log.info(asyncDemo3 Thread.currentThread().getName() 正在执行 ----------);try {Thread.sleep(1*1000);} catch (InterruptedException e) {e.printStackTrace();}log.info(asyncDemo3 Thread.currentThread().getName() 执行结束);}}2.4 启动测试通过 AsyncApplication 启动 SpringBoot 项目Postman 进行接口测试http://127.0.0.1:8080/async/demo我写了4个demo分别模拟4种情况详情在注释里有写。Slf4jRestControllerRequestMapping(/async)public class AsyncControllor {Autowiredprivate AsyncService asyncMethodService;Autowiredprivate BusinessService businessService;GetMapping(/demo)public String demo() {log.info(接口调用【开始】 --------------------);try {// 执行异步任务 - 自定义线程池asyncMethodService.asyncDemo1();asyncMethodService.asyncDemo2();asyncMethodService.asyncDemo3();// 执行异步任务 - 默认线程池businessService.asyncDemo4();} catch (Exception e) {return Exception;}log.info(接口调用【结束】 --------------------);return success;}}运行结果接口执行结束异步线程仍在运行总结EnableAsync 是启动 Async 异步线程的关键可以加载启动类上也可以加在配置文件上为了规避资源耗尽的风险推荐通过ThreadPoolExecutor的方式创建线程池Async 注解标注在方法上以便异步地调用该方法原文链接https://blog.csdn.net/weixin_44259720/article/details/130292656

相关新闻

揭秘HQTrack核心架构:InternT-MSDeAOTL-V2模型如何实现高精度实时追踪?

揭秘HQTrack核心架构:InternT-MSDeAOTL-V2模型如何实现高精度实时追踪?

揭秘HQTrack核心架构:InternT-MSDeAOTL-V2模型如何实现高精度实时追踪? 【免费下载链接】HQTrack Tracking Anything in High Quality 项目地址: https://gitcode.com/gh_mirrors/hq/HQTrack 你是否曾想过,如何让计算机像人类一样精准…

2026/7/6 21:28:26 阅读更多 →
从 0 新增一个 has.echo:我如何理解小程序容器里的 API 调用链路

从 0 新增一个 has.echo:我如何理解小程序容器里的 API 调用链路

从 0 新增一个 has.echo:我如何理解小程序容器里的 API 调用链路说明:本文是一次脱敏后的学习复盘。文中的 has.echo、EchoModule、system.demo 都是为了讲清楚调用链路而设计的最小示例,不包含公司内部源码、真实业务接口、真实模块路径和敏…

2026/7/6 21:28:26 阅读更多 →
151、RAG 检索增强生成(五):评估体系——RAGAS 指标、人工评测与线上监控

151、RAG 检索增强生成(五):评估体系——RAGAS 指标、人工评测与线上监控

151、RAG 检索增强生成(五):评估体系——RAGAS 指标、人工评测与线上监控 上周五凌晨两点,我被生产环境告警电话吵醒。用户反馈一个法律咨询机器人回答“根据《民法典》第X条,您需要承担全部责任”,但实际法条引用完全错误。我查了日志,发现RAG检索到的文档片段是某篇自…

2026/7/6 21:26:25 阅读更多 →

最新新闻

直流电机驱动系统优化:TC78H660FTG与PIC18F87J11方案

直流电机驱动系统优化:TC78H660FTG与PIC18F87J11方案

1. 项目背景与核心器件选型 在工业自动化和消费电子领域,直流电机驱动系统的效率优化一直是工程师面临的关键挑战。TC78H660FTG作为东芝新一代H桥驱动器,与Microchip的PIC18F87J11微控制器组合,为解决这一问题提供了创新方案。 1.1 TC78H66…

2026/7/6 22:19:03 阅读更多 →
Flink Web UI未授权访问漏洞修复实战:从原理到Nginx反向代理加固

Flink Web UI未授权访问漏洞修复实战:从原理到Nginx反向代理加固

1. 项目概述:一次真实的Flink安全加固实战最近在梳理线上数据平台的资产时,安全扫描工具突然弹出一个高危告警:Apache Flink Web Dashboard存在未授权访问漏洞。这个告警让我心头一紧,因为这意味着任何能访问到Flink Web UI地址的…

2026/7/6 22:15:01 阅读更多 →
基于Playwright与飞书API构建电商数据自动化采集与同步系统

基于Playwright与飞书API构建电商数据自动化采集与同步系统

1. 项目概述:当飞书多维表格遇上Playwright自动化最近在帮一个做电商的朋友解决一个头疼事:他每天要手动去几个不同的电商平台后台,把各个商品的销量、库存、评价数抄下来,再填到飞书多维表格里做数据分析。这事儿听着就累&#x…

2026/7/6 22:15:01 阅读更多 →
6D 位姿估计 2024 综述:从 PnP 到 FoundationPose 的 3 大范式演进

6D 位姿估计 2024 综述:从 PnP 到 FoundationPose 的 3 大范式演进

6D位姿估计2024全景:从PnP到FoundationPose的技术跃迁与产业落地1. 技术演进的三次浪潮在增强现实导航手术机器人和智能仓储分拣系统中,精确的物体空间定位能力正成为关键瓶颈。6D位姿估计(3D位置3D旋转)技术历经三次方法论革新&a…

2026/7/6 22:13:00 阅读更多 →
Python Playwright自动化实战:从截图到表单提交的完整指南

Python Playwright自动化实战:从截图到表单提交的完整指南

1. 项目概述:为什么选择Playwright做自动化最近在帮团队处理一个重复性的网页操作任务,需要每天定时登录几个后台系统,截图保存数据报表,再提交一些固定的表单。手动操作不仅耗时,还容易出错。一开始我考虑过Selenium&…

2026/7/6 22:10:59 阅读更多 →
Windows 11/10 内置 OpenSSH 对比 PuTTY:连接阿里云 ECS 的2种密钥方案实测

Windows 11/10 内置 OpenSSH 对比 PuTTY:连接阿里云 ECS 的2种密钥方案实测

Windows 原生OpenSSH与PuTTY深度对比:连接阿里云ECS的密钥管理实战指南1. 密钥连接ECS的核心价值与工具选择每次输入冗长密码连接服务器的日子该结束了。在阿里云ECS的SSH连接场景中,密钥对认证早已成为安全运维的黄金标准。相比传统密码认证&#xff0c…

2026/7/6 22:10:59 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻