SpringBoot的定时任务串行及并发记录

之前写【导入较大量数据异步处理】的文章里有提到,SpringBoot定时任务并发配置相关的,但是没有深耕其中的原理,趁有空的时候补充了解一下。以下是之前文章提到的:
一、默认是单线程的。
二、如果要并发设置定时器并发:
①在定时器上使用@Async注解实现异步任务,并需在启动类配合加上 @EnableAsync才会生效;
②手动设置定时任务的线程池大小:不使用@Async注解,新增启动代码配置类:
SpringBoot的定时任务串行及并发记录


其实对于以上的第一点默认单线程,默认定时器都是在同一个线程池用同一个线程来处理的,即单线程,是因为在定时任务注册类(ScheduledTaskRegistrar)里有这样一段源码:任务为空的时候,创建一个单线程的线程池
SpringBoot的定时任务串行及并发记录

然而,关于并发:
①在定时器上使用@Async注解实现异步任务,并需在启动类配合加上 @EnableAsync这个方法:是开启了多线程没错,但是任务的执行时机也不受其本身执行时间的限制,那这样就要注意可能会出现重复本任务自身并发操作导致数据异常了。

①新增启动代码配置类:
在这个类ScheduledTaskRegistrar下面是还有一个设置setTaskScheduler的方法,那我们就可以通过这个暴露的方法为定时器设定一个多线程的线程池完成并发了:
SpringBoot的定时任务串行及并发记录
此配置两个任务可以同时执行,同一个任务不会并发执行:对于同一个任务,上一个执行完后,再进行下一次任务。

单单文字是没有办法证明以上的结论的,so show me your code and test:

SpringBoot的定时任务串行及并发记录

SpringBoot的定时任务串行及并发记录

SpringBoot的定时任务串行及并发记录

从执行结果可以看出,确实是不同任务间并行,同一任务串行:
SpringBoot的定时任务串行及并发记录

附上:@EnableScheduling 加载顺序,SchedulingConfigurer –> TaskScheduler –>ScheduledExecutorService

上一篇:isula-build编译记录


下一篇:python与MATLAB混用问题