当前位置:网站首页>The role of @Async annotation and how to implement asynchronous listening mechanism
The role of @Async annotation and how to implement asynchronous listening mechanism
2022-08-04 23:19:00 【burst】
使用@Async标注在方法上,可以使该方法异步的调用执行.而所有异步方法的实际执行是交给TaskExecutor的.
Annotate on classes that need to be executed [email protected],比如,We now have an event to listen for
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;
}
}
Asynchronous listener implementation
@Component
public class HelloListen {
@EventListener
// Defined thread pool name
@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的安装与卸载
被领导拒绝涨薪申请,跳槽后怒涨9.5K,这是我的心路历程
[Cultivation of internal skills of string functions] strncpy + strncat + strncmp (2)
I was rejected by the leader for a salary increase, and my anger rose by 9.5K after switching jobs. This is my mental journey
956. 最高的广告牌
407. 接雨水 II
golang打开文件和读写文件
Will we still need browsers in the future?(feat. Maple words Maple language)
MySQL基础篇【聚合函数】
随机推荐
基于内容的图像检索系统设计与实现--颜色信息--纹理信息--形状信息--PHASH--SHFT特征点的综合检测项目,包含简易版与完整版的源码及数据!
Go 语言快速入门指南:什么是 TSL 安全传输层
容联云发送短信验证码
一点点读懂regulator(二)
Reconfigure the ffmpeg plugin in chrome
为何越来越多人选择进入软件测试行业?深度剖析软件测试的优势...
temp7777
MySQL的JSON 数据类型1
应用联合、体系化推进。集团型化工企业数字化转型路径
文章占位 文章占位
【3D建模制作技巧分享】ZBrush如何重新拓扑
[Mock Interview - 10 Years of Work] Are more projects an advantage?
【3D建模制作技巧分享】如何使用ZBrush导出效果图
当panic或者die被执行时,或者发生未定义指令时,如何被回调到
Vscode连接远程服务器(一套配置成功)
零基础如何入门软件测试?再到测开(小编心得)
[QNX Hypervisor 2.2用户手册]10.4 vdev hpet
Controller层代码这么写,简洁又优雅!
PID Controller Improvement Notes No. 7: Improve the anti-overshoot setting of the PID controller
【字符串函数内功修炼】strncpy + strncat + strncmp(二)