当前位置:网站首页>@Async注解的作用以及如何实现异步监听机制
@Async注解的作用以及如何实现异步监听机制
2022-08-04 23:08:00 【步尔斯特】
使用@Async标注在方法上,可以使该方法异步的调用执行。而所有异步方法的实际执行是交给TaskExecutor的。
在需要异步执行的类上标注@Async,比如,我们现在有一个需要监听的事件
public class HelloEven extends ApplicationEvent {
private String name;
public HelloEven(Object source,String name) {
super(source);
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
异步监听器实现
@Component
public class HelloListen {
@EventListener
// 定义的线程池名称
@Async("taskExecutor")
public void run(HelloEven even) {
System.out.println("==== " + Thread.currentThread().getName() + " ====" + even.getName());
}
}
// 输出结果
// ==== Async-Service-1 ====hello,baby
定义线程池
/** * 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务, * 当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; * 当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝 */
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
/** * 核心线程数(默认线程数) */
private static final int corePoolSize = 20;
/** * 最大线程数 */
private static final int maxPoolSize = 100;
/** * 允许线程空闲时间(单位:默认为秒) */
private static final int keepAliveTime = 10;
/** * 缓冲队列大小 */
private static final int queueCapacity = 200;
/** * 线程池名前缀 */
private static final String threadNamePrefix = "Async-Service-";
@Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveTime);
executor.setThreadNamePrefix(threadNamePrefix);
// 线程池对拒绝任务的处理策略
// CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
}
如下方式会使@Async失效
- 异步方法使用static修饰
- 异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类
- 异步方法不能与被调用的异步方法在同一个类中
- 类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象
- 如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解
边栏推荐
- MySQL的JSON 数据类型2
- PZK学C语言之字符串函数(一)
- [Cultivation of internal skills of string functions] strncpy + strncat + strncmp (2)
- 智慧养老整体解决方案
- 质量管理大师爱德华·戴明博士经典的质量管理14条原则
- ffplay视频播放原理分析
- Nacos配置中心之客户端长轮询
- 零基础如何入门软件测试?再到测开(小编心得)
- 文献阅读十——Detect Rumors on Twitter by Promoting Information Campaigns with Generative Adversarial Learn
- 【3D建模制作技巧分享】ZBrush如何重新拓扑
猜你喜欢
Since a new byte of 20K came out, I have seen what the ceiling is
【3D建模制作技巧分享】ZBrush模型如何添加不同材质
[Paper Notes KDD2021] MixGCF: An Improved Training Method for Graph Neural Network-based Recommender Systems
PID控制器改进笔记之七:改进PID控制器之防超调设定
仪表板展示 | DataEase看中国:数据呈现中国资本市场
Using ngrok to optimize web pages on raspberry pi (2)
go语言的日志实现(打印日志、日志写入文件、日志切割)
web3.js
【3D建模制作技巧分享】ZBrush模型制作流程:地精
MySQL的JSON 数据类型2
随机推荐
【3D建模制作技巧分享】如何使用ZBrush导出效果图
Nacos配置中心之客户端长轮询
从“草原牛”到“数字牛”:蒙牛的数字化转型之道
typeScript-promise
SRv6网络的安全解决方案
功耗控制之DVFS介绍
【3D建模制作技巧分享】ZBrush如何设置笔刷快捷键
年薪50W+的测试工程师都在用这个:Jmeter 脚本开发之——扩展函数
kernel hung_task死锁检测机制原理实现
[Cultivation of internal skills of string functions] strcpy + strcat + strcmp (1)
truffle
现在学习次世代3D游戏建模还能找到高薪好工作吗
Based on the results of the facts
【软件测试】常用ADB命令
文献阅读十——Detect Rumors on Twitter by Promoting Information Campaigns with Generative Adversarial Learn
MySQL的JSON 数据类型1
一点点读懂thermal(一)
ffplay视频播放原理分析
Implementing class target method exception using proxy object execution
Go 编程语言(简介)