spring常用注解(八)@Async
一、介绍
1、介绍
二、原理
三、集成与使用
1、集成方法
(1)开启
使用以下注解开启
@EnableAsync
(2)使用
在需要异步处理的方法上加上
@Async
2、返回值
@Async注解的方法返回值只能为void或者Future<T>。
(1)无返回值
(2)有返回值
使用AsyncResult包装下得到Future对象返回;调用处使用get方法获取。
3、demo
(1)初始化线程池
如我初始化了两个,分别在user模块、order模块使用
package com.demo.thread.constant;public class ThreadPoolConstant {public static final String USER_POOL = "userPool";public static final String ORDER_POOL = "orderPool";
}
package com.demo.thread.config;import com.demo.thread.constant.ThreadPoolConstant;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
@EnableAsync
public class ThreadPoolTaskExecutorConfig {private static int CORE_POOL_SIZE = 5;private static int MAX_POOL_SIZE = 10;@Bean(name= ThreadPoolConstant.USER_POOL)public ThreadPoolTaskExecutor userTaskExecutor(){ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();//线程池维护线程的最少数量poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);//线程池维护线程的最大数量poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);//线程池所使用的缓冲队列poolTaskExecutor.setQueueCapacity(200);//线程池维护线程所允许的空闲时间poolTaskExecutor.setKeepAliveSeconds(30000);poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);poolTaskExecutor.setBeanName(ThreadPoolConstant.USER_POOL);return poolTaskExecutor;}@Bean(name= ThreadPoolConstant.ORDER_POOL)public ThreadPoolTaskExecutor orderTaskExecutor(){ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();//线程池维护线程的最少数量poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);//线程池维护线程的最大数量poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);//线程池所使用的缓冲队列poolTaskExecutor.setQueueCapacity(200);//线程池维护线程所允许的空闲时间poolTaskExecutor.setKeepAliveSeconds(30000);poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);poolTaskExecutor.setBeanName(ThreadPoolConstant.ORDER_POOL);return poolTaskExecutor;}
}
(2)service
package com.demo.thread.service.impl;import com.demo.thread.constant.ThreadPoolConstant;
import com.demo.thread.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;@Service("userService")
@Slf4j
public class UserServiceImpl implements UserService {@Override@Async(ThreadPoolConstant.USER_POOL)public void create() {log.info("user create开始...");try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("user create结束...");}@Override@Async(ThreadPoolConstant.USER_POOL)public Future<List<String>> query() {log.info("user query 开始...");try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}List<String> userIds = new ArrayList<>();userIds.add("zs");userIds.add("ls");Future<List<String>> users = new AsyncResult(userIds);log.info("user query 结束...");return users;}
}
(3)controller
package com.demo.thread.controller;import com.demo.thread.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;@RestController
@RequestMapping("/test")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/create")public void create() {log.info("测试create开始");userService.create();log.info("测试create结束");}@RequestMapping("/query")public void query() {log.info("测试query开始");Future<List<String>> users = userService.query();log.info("调用query结束");try {List<String> userIds = users.get();log.info("query结果为:{}",userIds);} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}log.info("测试query结束");}
}
(4)启动类
package com.demo.thread;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ThreadApplicationStart {public static void main(String[] args) {SpringApplication.run(ThreadApplicationStart.class, args);}
}
(5)测试
无返回值:访问localhost:8080/test/create控制台输出:

有返回值:访问localhost:8080/test/query控制台输出:可以看到feture取结果会阻塞主线程,其他则按执行顺序打印

相关文章:
spring常用注解(八)@Async
一、介绍 1、介绍 二、原理 三、集成与使用 1、集成方法 (1)开启 使用以下注解开启 EnableAsync (2)使用 在需要异步处理的方法上加上 Async 2、返回值 Async注解的方法返回值只能为void或者Future<T>。 &…...
B站画质补完计划(3):智能修复让宝藏视频重焕新生
1 老片存在什么画质问题? B站作为一个拥有浓厚人文属性的平台社区,聚集了诸如《雍正王朝》、《三国演义》等经典影视剧集,同时也吸引了大量用户欣赏、品鉴这些人文经典 。但美中不足的是,由于拍摄年代久远、拍摄设备落后、数据多次…...
Spring Cloud Stream整合RocketMQ
Spring Cloud Stream整合RocketMQ 这里书接上回,默认你已经搭建好了RocketMQ主从异步集群,前面文章已经介绍过搭建方法。 1、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架,用于构建与共享消息系统连接的高度可扩展的事件驱动微服…...
Web前端浪漫源码:编织梦想与爱的交织乐章
Web前端浪漫源码:编织梦想与爱的交织乐章 在数字世界的广袤宇宙中,Web前端浪漫源码犹如一段段秘密的旋律,编织着梦想与爱的交织乐章。它们不仅是技术的结晶,更是情感的载体,将浪漫与创意融入每一个像素和每一行代码之…...
【云岚到家】-day02-4-我的账户-实名认证
【云岚到家】-day02-4-我的账户-实名认证 1 我的账户设置-实战1.1 配置OSS1.2 需求分析1.2.1 服务端设置银行账户1.2.2 机构端设置银行账户1.2.3 表结构设计1.2.4 表结构相关的controller、service、mapper、entity 1.3 服务端设置银行账户接口设计1.3.1 新增或更新银行账号信息…...
MySQL复习题(期末考试)
MySQL复习题(期末考试) 1.MySQL支持的日期类型? DATE,DATETIME,TIMESTAMP,TIME,TEAR 2.为表添加列的语法? alter table 表名 add column 列名 数据类型; 3.修改表数据类型的语法是? alter table 表名 modify 列名 新…...
利用DVWA演示文件上传漏洞获取网站shell权限(二)
文件上传漏洞是网络安全中常见的一种漏洞类型,攻击者可以利用该漏洞上传恶意文件到服务器上,从而获得对网站的远程控制权限。本文将以DVWA (Damn Vulnerable Web Application) 为例,演示如何利用文件上传漏洞的Medium级别设置,绕过…...
Java---BigInteger和BigDecimal和枚举
1.简介 1.BigInteger可以支持任意长度的整数 2.BigDecimal可以支持任意精度的浮点数 3.用来做精确计算 2.创建方式 new BigInteger(); new BigInteger(参数1,进制):可以将不同进制转成10进制显示 new BigDecimal(); BigInteger.valueOf(); BigDecimal.valueOf();…...
mybatis数据批量更新
1、mybatis批量更新mapper <update id"updateBatchById"><foreach collection"list" item"s" separator";">updatetableNamesetname #{name},whereid #{id}</foreach> </update>通过在数据库连接URL中指定…...
自动驾驶#芯片-1
概述 汽车是芯片应用场景之一,汽车芯片需要具备车规级。 车规级芯片对加工工艺要求不高,但对质量要求高。需要经过的认证过程,包括质量管理标准ISO/TS 16949、可靠性标准 AEC-Q100、功能安全标准ISO26262等。 汽车内不同用途的芯片要求…...
【保姆级讲解下QT6.3】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
windows安装conda
1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。Conda 是为 Python 程序创建的,适用于 Linux,OS X 和Windows,也可以打包和分发其他软…...
ubuntu设置GPU功率
前言 上次发了一篇文章,我使用脚本自动根据GPU温度调整服务器风扇转速 但是我实测之后,发现这个方法还是压不住我GPU的温度,暂时不清楚什么原因 所以我准备把GPU功耗压低 先看看gpu的功耗限制 nvidia-smi -q -d POWER使用上面的命令会输出…...
[发布]嵌入式系统远程测控软件-基于Qt
目录 一. 引言二. 软件功能2.1 原理2.2 软件功能2.3 运行环境 三. 软件操作使用3.1 软件界面3.2 软件功能使用详解3.2.1 连接3.2.2 数据监测(串口示波器)3.2.3 数据修改3.2.4 数据保存 3.3 软件的硬件连接 四. 通信协议——STM32移植篇4.1 通信协议4.2 S…...
【数据结构】查找(顺序查找、二分查找、索引顺序查找、二叉排序树、平衡排序树、B树、B+树、哈希表)
目录 数据结构——查找何为查找1. 查找表2. 关键字3. 查找方法效果评价指标——平均查找长度ASL(Average Search Length) 静态查找表1.顺序查找2.二分查找二分查找判定树 3.静态查找表—索引顺序表的查找索引顺序查找表的算法原理: 动态查找树表1. 二叉排序树2. 二叉…...
远程连接路由器:方法大全与优缺点解析
远程连接路由器的方式主要有以下几种,以下是每种方式的详细说明及其优缺点: 使用Web浏览器登录 方法:通过配置路由器的远程管理功能,允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…...
NI USB-6009 DAQ采集卡拆解
所需设备: 1、NI USB-6009采集卡; 2、逻辑分析仪; NI USB-6009采集卡全貌: 性能参数: 内部照片: ADC芯片指标: 接线图: 差分模式采样: 采集过程中的SPI总线数据监控&a…...
详细分析Mysql临时变量的基本知识(附Demo)
目录 前言1. 用户变量2. 会话变量 前言 临时变量主要分为用户变量和会话变量 1. 用户变量 用户变量是特定于会话的,在单个会话内可以在多个语句中共享 以 符号开头在 SQL 语句中使用 SET 语句或直接在查询中赋值 声明和赋值 SET var_name value; -- 或者 SE…...
JS的五种事件函数,各自应用场景又分别是什么
在JavaScript中,常用的五种事件函数包括: 1. onclick:当用户点击某个元素时触发,适用于处理按钮点击、链接点击等场景。 2. onkeydown:当用户按下某个键盘的按键时触发,适用于处理键盘输入相关的操作&#…...
电脑想加个WIFI功能,怎么选!
在快速发展的物联网和智能家居时代,Wi-Fi模块作为连接各类智能设备与互联网的桥梁,其重要性不言而喻。而为了让这些模块能够适应各式各样的应用场景,不同的接口技术应运而生。今天,我们就来深入浅出地探讨几种常见的Wi-Fi模块接口,包括它们的工作原理、特点以及适用场景,…...
【Web安全】-企业资产信息收集(1):信息收集介绍,域名信息收集,主域名查询,ICP备案号查询,备案实体查询,工业和信息化部政务服务平台查询,怎样收集
🦆 个人主页:深邃- ❄️专栏传送门:《C语言》《数据结构与算法》《Web安全》 🌟Gitee仓库:《C语言》《数据结构与算法》 特此声明:本次信息收集均在日期授权时间内收集,并且都将所有人员信息打…...
UE5手写HLSL实现高斯模糊:精准控制σ与采样策略
1. 这不是“调个参数就完事”的模糊——为什么UE5里手写HLSL才是高斯模糊的正解在UE5材质编辑器里拖几个“Blur”节点,调调Radius,预览框里画面立刻柔化——这确实是最快上手的方式。但上周我帮一个做影视级虚拟制片的团队优化镜头转场效果时,…...
企业里大量重复性工作正在拖垮效率,你是否也深陷其中?2026年企业级Agent全场景落地指南
进入2026年,企业数字化转型已从“工具竞赛”转向“效能质变”。 尽管各种SaaS、ERP系统早已普及,但一个诡异的悖论依然存在: 系统越多,跨系统的搬运工作反而越多。 大量员工仍深陷在数据录入、报表核对、系统比对等机械性重复劳动…...
从账单明细看 Taotoken 按 Token 计费如何实现成本精细化
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从账单明细看 Taotoken 按 Token 计费如何实现成本精细化 1. 引言:从模糊估量到精确计量 在接入和使用大模型 API 时&…...
AI大模型学习顺序_七步掌握大模型精髓:从入门到精通的进阶秘籍!
本文以“七层关系”为框架,系统地阐述了学习大模型的最佳路径。从基础概念入手,逐步深入到模型架构、训练技巧、应用场景等核心内容,旨在帮助读者构建完整的知识体系,最终实现从入门到精通的全面提升。按“七层关系”学大模型&…...
Ventoy解决方案:告别重复格式化的万能启动盘制作神器
Ventoy解决方案:告别重复格式化的万能启动盘制作神器 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy Ventoy是一款革命性的开源可启动USB解决方案,通过创新的免格式化技术&…...
Navicat Premium16 免费安装配置教程(附安装包)
一、下载安装包 官网下载:https://www.navicat.com.cn/products#navicat 可直接网盘下载 链接:https://pan.baidu.com/s/1t3Tx0c8gEaMEifGow_05aQ?pwd8888 二、安装过程 1. 双击安装包 2. 选中“我同意”,点击“下一步”。 3.…...
紧急!2024年Q2最新:Claude 3.5 Sonnet对LaTeX/Markdown混合文档的支持边界实测报告(附绕过限制的3种军工级方案)
更多请点击: https://kaifayun.com 第一章:Claude 3.5 Sonnet对LaTeX/Markdown混合文档的原生支持能力全景评估 Claude 3.5 Sonnet 在处理 LaTeX 与 Markdown 混合文档时展现出显著增强的解析鲁棒性与语义理解深度,尤其在数学公式嵌入、交叉…...
LLM-DSE框架:大语言模型优化硬件加速器设计
1. LLM-DSE框架概述:当大语言模型遇上硬件加速器设计在硬件加速器设计领域,高层次综合(HLS)技术通过将抽象层级从寄存器传输级(RTL)提升到C/C,显著降低了开发门槛。然而,HLS指令参数…...
iOS自动化测试避坑指南:WebDriverAgent签名与真机调试实战
1. 这不是“又一个Appium教程”,而是我踩了三个月坑后画的避坑地图你搜“Appium iOS自动化测试教程”,首页全是“三步跑通Demo”“手把手教你写第一个脚本”——结果照着做,Xcode一编译就报错,WebDriverAgent装不上,真…...
