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

简介: SpringBoot定时任务的串行和并行

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


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

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

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

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

image

image

image

从执行结果可以看出,确实是不同任务间并行,同一任务串行:
image

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

目录
相关文章
|
1月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
183 0
|
3月前
|
Java
SpringBoot 接口并发限制(Semaphore)
SpringBoot 接口并发限制(Semaphore)
95 1
|
6月前
|
NoSQL Java 数据库
【三十】springboot项目上高并发解决示例
【三十】springboot项目上高并发解决示例
324 3
|
Java 调度
Springboot 使用Quartz定时器执行多个定时任务 配置篇
Springboot 使用Quartz定时器执行多个定时任务 配置篇
794 0
Springboot 使用Quartz定时器执行多个定时任务 配置篇
|
Java 测试技术 API
Spring Boot + @Async 太好用了,助你大大提升 API 并发能力!
Spring Boot + @Async 太好用了,助你大大提升 API 并发能力!
149 0
|
存储 NoSQL Java
SpringBoot集成Redis业务功能 02、定时任务+Redis删除特定前缀key的优雅实现
SpringBoot集成Redis业务功能 02、定时任务+Redis删除特定前缀key的优雅实现
|
JavaScript Dubbo Java
SpringBoot实现定时任务的三种方式,总有一款适合你!
SpringBoot实现定时任务的三种方式,总有一款适合你!
SpringBoot实现定时任务的三种方式,总有一款适合你!
|
Java 数据库 Spring
SpringBoot实现动态增删启停定时任务
SpringBoot实现动态增删启停定时任务
466 0
SpringBoot实现动态增删启停定时任务
|
Oracle NoSQL Java
Springboot Quartz定时任务的动态调度使用,实战详解
Springboot Quartz定时任务的动态调度使用,实战详解
518 0
Springboot Quartz定时任务的动态调度使用,实战详解
|
Java Linux
Springboot2.x整合定时任务的小案例(某年某月某日执行)
有时候在开发中经常会使用一些定时的任务,比如果整点推送,或者是每隔一段时间给客户发送一个消息等等。这篇文章主要是通过Springboot整合Schedule来实现一个定时任务,非常的简单
323 0
Springboot2.x整合定时任务的小案例(某年某月某日执行)

热门文章

最新文章

下一篇
无影云桌面