定时任务@Scheduled之单线程多线程问题
现象
在一个类内,写了两个定时任务,发现它们竟然是串行执行的。
于是想到, @Scheduled 该不会是单线程执行折吧?
于是找了一下,发现还真的是。。。
可参考: https://blog.csdn.net/Mr_EvanChen/article/details/103408290
解决方案
1、ScheduledTaskRegistrar 有一个 setScheduler() 方法,
可以通过这个方法,设置它的执行线程池。。。改为多核心线程数的线程池。
@Configuration public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(Executors.newScheduledThreadPool(50)); } @Bean public Executor taskExecutor() { ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(10); threadPoolTaskScheduler.setThreadNamePrefix("My-Schedule: "); threadPoolTaskScheduler.initialize(); return threadPoolTaskScheduler; } }
2、在原来的模块,加 上这个配置,它就变成多线程执行了。
注意
这种方法,每次定时任务启动的时候,都会创建一个单独的线程来处理。也就是说同一个定时任务也会启动多个线程处理。
例如:任务1和任务2一起处理,但是线程1卡死了,任务2是可以正常执行的。且下个周期,任务1还是会正常执行,不会因为上一次卡死了,影响任务1。
但是任务1中的卡死线程越来越多,会导致50个线程池占满,还是会影响到定时任务。
所以,如果发现有定时任务会长时间卡住,还是赶紧解决掉才行呀~
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)