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

Spring Boot使用异步线程池

1、启用异步支持

在启动类或配置类上添加@EnableAsync注解,激活异步处理能力。

@SpringBootApplication 
@EnableAsync 
public class Application {  
}

2、自定义线程池

@Configuration 
public class AsyncConfig {
    @Bean("customExecutor")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);      // 核心线程数 
        executor.setMaxPoolSize(20);       // 最大线程数 
        executor.setQueueCapacity(100);    // 队列容量 
        executor.setThreadNamePrefix("Async-");  
        executor.setRejectedExecutionHandler(new  ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize(); 
        return executor;
    }
}

Spring Boot 2.1.0 之前的版本默认线程池:SimpleAsyncTaskExecutor。此线程池的特点是每次执行任务时都会新建线程(不重用线程),且不限制线程数量,高并发场景下可能导致资源耗尽。

Spring Boot 2.1.0 及更高版本默认线程池:ThreadPoolTaskExecutor。Spring Boot 在 TaskExecutionAutoConfiguration 中自动配置了一个默认线程池,核心参数为:核心线程数:8,最大线程数:Integer.MAX_VALUE,队列容量:Integer.MAX_VALUE,线程名前缀:task-,此线程池的 Bean 名称为 applicationTaskExecutor,在未自定义线程池时会优先使用它。

3、定义异步方法

在需要异步执行的方法上添加@Async,并确保该方法所属类被Spring管理(如使用@Service或@Component注解),使用时指定线程池名称。

@Service 
public class AsyncService {
    @Async("customExecutor")
    public void sendSms() {
        // 异步执行逻辑 
    }
}

注意:禁止同类调用:异步方法不能在同一个类中通过内部方法调用,必须通过Spring代理对象调用(如通过@Autowired注入自身)。@Async仅对public方法生效。@Async不能修饰静态方法。异步类需避免循环依赖,否则可能导致代理失效。

任务提交阶段活跃线程数队列占用线程池状态关键现象
初始 10 任务100/100核心线程饱和无队列堆积
累计 110 任务10100/100队列满载,线程未扩容任务开始延迟
累计 120 任务20100/100线程池扩容至最大值系统负载达到峰值
累计 121 任务20100/100触发拒绝策略服务降级,需告警干预

相关文章:

  • Linux文件搜索与文本过滤全攻略:find、locate、grep深度解析
  • 巧文书-标书产品功能介绍
  • Linux的例行性工作
  • springcloud项目在框架搭建时的问题的总结
  • 物联网革新,智慧城市未来揭秘
  • 调用高德天气Api,并展示对应天气图标
  • pnpm 依赖升级终极指南:从语义化版本控制到 Monorepo 全局更新的企业级实践
  • 谈谈 Webpack 中的 Loader 和 Plugin,它们的区别是什么?
  • Lock wait timeout exceeded; try restarting transaction
  • 日常学习开发记录-switch组件
  • JVM - 垃圾回收基本问题
  • 【力扣hot100题】(009)和为K的子数组
  • 运算放大器(二)运算放大器的选型与应用
  • Xen-cpu@100->cpu@1:Failed to bring up CPU 1 (error -2)
  • Warm-Flow过去、现在和未来都不会有商业版
  • 搭建FTP环境且通过Kali Linux破解FTP用户名密码例子
  • 双指针---《复写零》
  • 使用keepalived结合tomcat和nginx搭建三主热备架构
  • 【零基础学python】python高级语法(四)
  • Java 大视界 -- Java 大数据在智能政务数字身份认证与数据安全共享中的应用(156)
  • wordpress标题优化/深圳网站营销seo费用
  • wordpress 防注入广告/北京网站优化体验
  • 湖南省建设工程网站/seo如何提升排名收录
  • 建设银行 嘉定 网站/公司软文怎么写
  • 网站建设逻辑/怎么进行seo
  • 快速学习网站制作/广州:推动优化防控措施落地