当前位置: 首页 > news >正文

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、集成方法 &#xff08;1&#xff09;开启 使用以下注解开启 EnableAsync &#xff08;2&#xff09;使用 在需要异步处理的方法上加上 Async 2、返回值 Async注解的方法返回值只能为void或者Future<T>。 &…...

B站画质补完计划(3):智能修复让宝藏视频重焕新生

1 老片存在什么画质问题&#xff1f; B站作为一个拥有浓厚人文属性的平台社区&#xff0c;聚集了诸如《雍正王朝》、《三国演义》等经典影视剧集&#xff0c;同时也吸引了大量用户欣赏、品鉴这些人文经典 。但美中不足的是&#xff0c;由于拍摄年代久远、拍摄设备落后、数据多次…...

Spring Cloud Stream整合RocketMQ

Spring Cloud Stream整合RocketMQ 这里书接上回&#xff0c;默认你已经搭建好了RocketMQ主从异步集群&#xff0c;前面文章已经介绍过搭建方法。 1、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息系统连接的高度可扩展的事件驱动微服…...

Web前端浪漫源码:编织梦想与爱的交织乐章

Web前端浪漫源码&#xff1a;编织梦想与爱的交织乐章 在数字世界的广袤宇宙中&#xff0c;Web前端浪漫源码犹如一段段秘密的旋律&#xff0c;编织着梦想与爱的交织乐章。它们不仅是技术的结晶&#xff0c;更是情感的载体&#xff0c;将浪漫与创意融入每一个像素和每一行代码之…...

【云岚到家】-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复习题&#xff08;期末考试&#xff09; 1.MySQL支持的日期类型&#xff1f; DATE,DATETIME,TIMESTAMP,TIME,TEAR 2.为表添加列的语法&#xff1f; alter table 表名 add column 列名 数据类型; 3.修改表数据类型的语法是&#xff1f; alter table 表名 modify 列名 新…...

利用DVWA演示文件上传漏洞获取网站shell权限(二)

文件上传漏洞是网络安全中常见的一种漏洞类型&#xff0c;攻击者可以利用该漏洞上传恶意文件到服务器上&#xff0c;从而获得对网站的远程控制权限。本文将以DVWA (Damn Vulnerable Web Application) 为例&#xff0c;演示如何利用文件上传漏洞的Medium级别设置&#xff0c;绕过…...

Java---BigInteger和BigDecimal和枚举

1.简介 1.BigInteger可以支持任意长度的整数 2.BigDecimal可以支持任意精度的浮点数 3.用来做精确计算 2.创建方式 new BigInteger(); new BigInteger(参数1,进制)&#xff1a;可以将不同进制转成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

概述 汽车是芯片应用场景之一&#xff0c;汽车芯片需要具备车规级。  车规级芯片对加工工艺要求不高&#xff0c;但对质量要求高。需要经过的认证过程&#xff0c;包括质量管理标准ISO/TS 16949、可靠性标准 AEC-Q100、功能安全标准ISO26262等。  汽车内不同用途的芯片要求…...

【保姆级讲解下QT6.3】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

windows安装conda

1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。Conda 是为 Python 程序创建的&#xff0c;适用于 Linux&#xff0c;OS X 和Windows&#xff0c;也可以打包和分发其他软…...

ubuntu设置GPU功率

前言 上次发了一篇文章&#xff0c;我使用脚本自动根据GPU温度调整服务器风扇转速 但是我实测之后&#xff0c;发现这个方法还是压不住我GPU的温度&#xff0c;暂时不清楚什么原因 所以我准备把GPU功耗压低 先看看gpu的功耗限制 nvidia-smi -q -d POWER使用上面的命令会输出…...

[发布]嵌入式系统远程测控软件-基于Qt

目录 一. 引言二. 软件功能2.1 原理2.2 软件功能2.3 运行环境 三. 软件操作使用3.1 软件界面3.2 软件功能使用详解3.2.1 连接3.2.2 数据监测&#xff08;串口示波器&#xff09;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.静态查找表—索引顺序表的查找索引顺序查找表的算法原理&#xff1a; 动态查找树表1. 二叉排序树2. 二叉…...

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…...

NI USB-6009 DAQ采集卡拆解

所需设备&#xff1a; 1、NI USB-6009采集卡&#xff1b; 2、逻辑分析仪&#xff1b; NI USB-6009采集卡全貌&#xff1a; 性能参数&#xff1a; 内部照片&#xff1a; ADC芯片指标&#xff1a; 接线图&#xff1a; 差分模式采样&#xff1a; 采集过程中的SPI总线数据监控&a…...

详细分析Mysql临时变量的基本知识(附Demo)

目录 前言1. 用户变量2. 会话变量 前言 临时变量主要分为用户变量和会话变量 1. 用户变量 用户变量是特定于会话的&#xff0c;在单个会话内可以在多个语句中共享 以 符号开头在 SQL 语句中使用 SET 语句或直接在查询中赋值 声明和赋值 SET var_name value; -- 或者 SE…...

JS的五种事件函数,各自应用场景又分别是什么

在JavaScript中&#xff0c;常用的五种事件函数包括&#xff1a; 1. onclick&#xff1a;当用户点击某个元素时触发&#xff0c;适用于处理按钮点击、链接点击等场景。 2. onkeydown&#xff1a;当用户按下某个键盘的按键时触发&#xff0c;适用于处理键盘输入相关的操作&#…...

电脑想加个WIFI功能,怎么选!

在快速发展的物联网和智能家居时代,Wi-Fi模块作为连接各类智能设备与互联网的桥梁,其重要性不言而喻。而为了让这些模块能够适应各式各样的应用场景,不同的接口技术应运而生。今天,我们就来深入浅出地探讨几种常见的Wi-Fi模块接口,包括它们的工作原理、特点以及适用场景,…...

机器学习——决策树

决策树 决策树可以理解为是一颗倒立的树&#xff0c;叶子在下端&#xff0c;根在最上面 一层一层连接的是交内部节点&#xff0c;内部节点主要是一些条件判断表达式&#xff0c;叶子叫叶节点&#xff0c;叶节点其实就是最终的预测结果&#xff0c;那么当输入x进去&#xff0c;…...

弘君资本:苹果股价暴涨,创历史新高!

当地时间6月11日&#xff0c;美股三大指数涨跌纷歧&#xff0c;标普500指数与纳指再创新高。 到收盘&#xff0c;道指跌0.31%&#xff0c;纳指涨0.88%&#xff0c;标普500指数涨0.27%。 苹果大涨逾7%创前史新高。美联储开端召开6月货币方针会议&#xff0c;周三发布利率决定。…...

web前端拖拽工具:探索其复杂性、困惑度与爆发度

web前端拖拽工具&#xff1a;探索其复杂性、困惑度与爆发度 在Web前端开发中&#xff0c;拖拽功能是一项常见且复杂的需求。拖拽工具可以帮助开发者更高效地实现这一功能&#xff0c;但同时也带来了一定的困惑和挑战。本文将从四个方面、五个方面、六个方面和七个方面对Web前端…...

Web前端数据驱动视图的深度解析

Web前端数据驱动视图的深度解析 在Web前端开发中&#xff0c;数据驱动视图的概念日渐重要&#xff0c;它不仅改变了传统的开发模式&#xff0c;更使得页面动态化和交互性得到了极大的提升。然而&#xff0c;对于许多初学者和开发者来说&#xff0c;如何深入理解和应用这一概念…...

HTML5的新语义化标签

HTML5 引入了一系列新的语义化标签&#xff0c;这些标签为网页内容提供了更明确的含义&#xff0c;有助于改善网页的可访问性和搜索引擎优化&#xff08;SEO&#xff09;。以下是一些主要的 HTML5 语义化标签&#xff1a; <article>&#xff1a; 表示页面、应用或网站中…...

周一美股集体低开后转涨,早盘仅道指小幅下跌,英伟达跌超3%后转涨超1%

美国非农就业报告发布“次日”&#xff0c;三大股指低开&#xff0c;但早盘均成功转涨。美股七姐妹涨跌各异&#xff0c;苹果WWDC大会今晚开幕&#xff0c;但早盘转跌&#xff0c;一度跌超1%&#xff1b;1拆10股正式生效的英伟达盘初曾跌超3.2%&#xff0c;开盘1.5小时内首次转…...

Phybers:脑纤维束分析软件包

摘要 本研究提供了一个用于分析脑纤维束数据的Python库(Phybers)。纤维束数据集包含由表示主要白质通路的3D点组成的流线(也称为纤维束)。目前已经提出了一些算法来分析这些数据&#xff0c;包括聚类、分割和可视化方法。由于流线的几何复杂性、文件格式和数据集的大小(可能包…...

手机丢失不惊慌,华为手机已升级至楼层级设备查找!

出门总是丢三落四&#xff0c;手机丢了怎么办&#xff1f;不要怕&#xff0c;只要你的华为手机升级至云空间新版本&#xff0c;就可以进行楼层级设备查找&#xff0c;现在可以查看到具体的楼层了&#xff01; 之前有手机丢失过的朋友&#xff0c;肯定有相似的经历&#xff0c…...

SpringBoot 的多配置文件

文章目录 SpringBoot 的多配置文件spring.profiles.active 配置Profile 和 ActiveProfiles 注解 SpringBoot 的多配置文件 spring.profiles.active 配置 默认情况下&#xff0c;当你启动 SpringBoot 项目时&#xff0c;会在日志中看到如下一条 INFO 信息&#xff1a; No act…...

[Java基础揉碎]网络相关概念

目录 网络通信 网络 ip地址 ​编辑 域名 ​编辑 网络协议 TCP和UDP 网络编程比较重要的的InetAddress类 Socket ​编辑 tcp字节流编程 案例一 案例二​编辑 案例三 网络上传文件 ​编辑​编辑 ​编辑 netstat tcp网络通信客户端也是通过端口和服务端进行通讯的…...

教人做家具的网站/seo关键词平台

手机拍照反差对焦、相位对焦和激光对焦系统解析 参考网址:https://jingyan.baidu.com/article/22a299b5c882a29e19376aad.html 手机拍照三大对焦系统解析#资料课代表 | 讲窍门# 你最常使用的拍照工具是什么?很多人的第一直觉可能就是手机,而对于专业从事影视相关工作的人来…...

如何制作个人网站教程/网络公司网站建设

好的,我正在尝试从文本文件创建字典,因此键是单个小写字符,每个值都是文件中以该字母开头的单词的列表. 文本文件每行包含一个小写单词,例如&#xff1a; airport bathroom boss bottle elephant 输出&#xff1a; words {a: [airport], b: [bathroom, boss, bottle], e:[elep…...

wordpress的按装方法/网站关键词优化教程

mysql中text,longtext,mediumtext字段类型的意思 MySQL支持大量的列类型&#xff0c;它可以被分为3类&#xff1a;数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述&#xff0c;并且总结每个列类型的存储需求&#xff0c;然后提供每个类中的类型…...

wordpress多菜单/北京度seo排名

错误现象 : Paper’s imageable width is too small. 解决方案 : int x 1000; int y 1000; // 设置打印参数 PrintRequestAttributeSet aset new HashPrintRequestAttributeSet();// 设置纸张大小 , 实际测试没有这个功能, 还是要标签打印机设置 MediaPrintableArea area …...

360免费建站可靠吗/一站式网络营销

我们在做应用程序的时候有时候想知道页面上的按钮对于某一事件委托链上有多少方法&#xff0c;下面是一个例子。1、先添加3个按钮&#xff0c;分别添加0个&#xff0c;1个&#xff0c;2个click事件的方法&#xff0c;按钮名字分别为button1&#xff0c;button2&#xff0c;butt…...

景观设计公司理念/南宁百度seo排名优化

假设都不太安全&#xff0c;但是我很确信如果我大声宣布小孩爱玩具&#xff0c;你一定就会同意了。是的&#xff0c;他们也喜欢卡通。现在又出现了一个趋势就是&#xff1a;他们还喜欢iPad。有人说这曾是2010年出现的新玩具Y Combinator下63家企业中的一个新创业公司今天出来鸟…...