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

Springboot之@Async异步指定自定义线程池使用

开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到@Async。但是直接使用 @Async 会有风险,当我们没有指定线程池时,他会默认使用其Spring自带的 SimpleAsyncTaskExecutor 线程池,会不断的创建线程,当并发大的时候会严重影响性能。所以可以将异步指定线程池使用。

@Async用法:可以标注在类或方法上,用于实现方法的异步执行。当被标注在类上时,表明类中的所有方法都被指定的异步执行器执行。

一、开启异步

启动类添加@EnableAsync开启异步

@EnableAsync
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

二、配置线程池

可以在yml里配置,我这里写的配置类

@EnableAsync
@Configuration
public class ThreadPoolConfig {/*** 线程池任务执行器* @return*/@Beanpublic Executor taskExecutor() {// 创建线程池ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5); // 设置核心池大小executor.setMaxPoolSize(10); // 设置最大池大小,只有在缓冲队列满了之后才会申请超过核心线程数的线程executor.setQueueCapacity(100); // 设置队列容量executor.setKeepAliveSeconds(60); // 设置保持活动秒数,当超过了核心线程数之外的线程在空闲时间到达之后会被销毁executor.setThreadNamePrefix("开始啦Thread-"); // 设置线程名称前缀// 设置拒绝的执行处理策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}

拒绝策略通常有四种:

  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
  2. ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
  4. ThreadPoolExecutor.CallerRunsPolicy:重试添加当前的任务,自动重复调用 execute() 方法,直到成功

注:配置类需要加上@EnableAsync,开启异步可用

三、Async指定线程池

在@Async注解中直接指定线程池名称即可

	@Async("taskExecutor")public void asyncDemo() {// 逻辑代码...}

四、@Async失效可能原因

  1. 启动类或线程池配置类没加@EnableAsync注解
  2. 调用方法和@Async方法不要在一个类中
  3. @Async方法的返回值只能是void和Future
  4. @Async修饰的方法不能被static修饰
  5. @Async修饰的的方法必须是public

题外话,之前面试有问到过异步线程池的大小怎么合理来设置,感兴趣的小伙伴们可以去研究一下哈

http://www.lryc.cn/news/31791.html

相关文章:

  • 视频知识点(23)- TS格式详解指南
  • linux篇【16】:传输层协议<后序>
  • 【C语言】动态内存管理
  • 【Pytorch】AutoGrad个人理解
  • 华硕z790让独显和集显同时工作
  • 提高编程思维的python代码
  • CSS背景background属性整理
  • AQS底层源码深度剖析-Lock锁
  • 网络编程(二)
  • 访问学者进入美国哪些东西不能带?
  • 灵巧手抓持<分类><仿真>
  • CENTO OS上的网络安全工具(十九)ClickHouse集群部署
  • tesseract -图像识别
  • JavaScript Math 算数对象
  • 一体机HDATA节点添加和删除
  • 关于 interface{} 会有啥注意事项?上
  • Matlab中旧版modem.qammod与新版不兼容
  • 通达信指标公式颜色代码的四种写法(COLOR/RGB)
  • 小程序面试题收集(持续更新中...)
  • 最深情的告白——郁金香(Python实现)
  • 代码随想录算法训练营第六天|242.有效的字母异位词 、349. 两个数组的交集 、 202. 快乐数、1. 两数之和
  • 【STL】模拟实现list
  • Spring Cloud Alibaba全家桶(五)——微服务组件Nacos配置中心
  • 【微信小程序】-- 页面事件 - 下拉刷新(二十五)
  • springboot启动过程加载数据笔记(springboot3)
  • 中文代码86
  • 网络参考模型
  • Spark Tungsten
  • 2023年总结的web前端学习路线分享(学习导读)
  • MyBatis学习笔记(十) —— 动态SQL