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

10_Spring Boot 中的 @Scheduled 注解是单线程还是多线程?同步还是异步?

🔟 10_Spring Boot 中的 @Scheduled 注解是单线程还是多线程?同步还是异步?

✅ 结论先行

Spring Boot 中的 @Scheduled 注解默认是 单线程且同步执行 的。

这意味着:
如果你定义了多个使用 @Scheduled 注解的定时任务,它们会共用一个线程顺序执行。一旦其中某个任务执行时间较长或发生异常,可能会阻塞其他定时任务的正常调度


✅ 如何解决:将定时任务配置为多线程执行

为了让定时任务支持并发执行(多线程),可以采用以下三种方式之一:


✅ 方式一:定义 TaskScheduler Bean

@Configuration
public class ScheduleConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();// 设置线程池大小(建议:CPU 核心数 * 2)scheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 2);return scheduler;}}

✅ 方式二:实现 SchedulingConfigurer 接口配置线程池

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2));}
}

✅ 方式三:通过配置文件开启多线程支持(Spring Boot 2.1+)

spring:task:scheduling:pool:size: 8  # 设置定时任务线程池大小

⚠️ 注意:该方式依赖 Spring Boot 的自动配置机制,适用于较新版本。


✅ 如果希望定时任务异步执行怎么办?

多线程 ≠ 异步。如果你希望某个定时任务在调度后立即返回,由独立线程异步执行,可以启用 Spring 的异步机制:

步骤一:在启动类上添加 @EnableAsync 注解

@SpringBootApplication
@EnableAsync
public class Application {// ...
}

步骤二:在定时任务方法上添加 @Async 注解

@Scheduled(cron = "0 */1 * * * ?")
@Async
public void runTask() {// 异步执行的任务逻辑
}

✅ 总结

问题默认行为推荐配置方式
是否单线程执行?是(共用一个线程)使用线程池配置为多线程
是否同步执行?是(方法阻塞)使用 @Async 异步注解
是否可以自定义线程数?配置 TaskScheduler 或 YAML 文件
http://www.lryc.cn/news/598842.html

相关文章:

  • Percona pt-archiver 出现长事务
  • IntelliJ IDEA
  • 单片机的第一个程序—LED灯的控制
  • HBase + PostgreSQL + ElasticSearch 联合查询方案
  • 斐波那契数列策略
  • 新能源电池厂自动化应用:Modbus TCP转DeviceNet实践
  • Opencv C# 重叠 粘连 Overlap 轮廓分割 (不知道不知道)
  • C语言(长期更新)第5讲:数组练习(三)
  • windows11通过wsl安装Ubuntu到D盘,安装docker及宝塔面板
  • 【物联网】基于树莓派的物联网开发【16】——树莓派GPIO控制LED灯实验
  • 卫星物联网:使用兼容 Arduino 的全新 Iridium Certus 9704 开发套件深入探索
  • MSOP/DIFOP端口 vs. IP地址的关系以及每个IP下面有什么自己的东西
  • JavaSE:对一门面向对象语言有一个初步认识
  • pytest官方Tutorial所有示例详解(二)
  • 这几天都是发癫写的
  • 计算机视觉技术剖析:轮廓检测、模板匹配及特征点匹配
  • 背包DP之分组背包
  • 读书笔记(王阳明心学)
  • 高可用架构模式——异地多活设计步骤
  • 物流仓储自动化升级:Modbus TCP与DeviceNet的协议融合实践
  • C++实战:人脸识别7大核心实例
  • 【数据结构初阶】--二叉树(二)
  • FreeSWITCH 简单图形化界面45 - 收集打包的一些TTS
  • 内网IM:BeeWorks私有化部署的安全通讯解决方案
  • 安全插座项目规划书
  • 【VSCode】复制到下一行快捷键
  • 2024年ASOC SCI2区TOP,基于强化学习教与学优化算法RLPS-TLBO+风电场布局优化,深度解析+性能实测
  • Go基础教程 从零到英雄:30分钟掌握Go语言核心精髓
  • Go语言管道Channel通信教程
  • 黑马点评系列问题之p44实战篇商户查询缓存 jmeter如何整