springboot中的定时任务
在springboot中,使用定时任务之前,需要在启动类添加@EnableScheduling注解,springboot中,
1.定时任务默认是单线程的,如果只在定时任务方法上添加@Scheduled注解:
1)如果只有一个定时任务,且该任务的执行时间大于定时任务间隔时间(比如每分钟执行一次,方法执行时间为两分钟),那么下次任务将会阻塞,等上一次任务执行完之后才执行(两分钟后)
// 示例1代码
@Scheduled(initialDelay = 1000, fixedDelay = 1000)
void task1() {
for (int i = 0; i < 5; i++) {
log.info("\n======================= task1:{}===========================", Thread.currentThread() + "" + i);
try {
// 休眠5秒
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果(始终只有一个线程,且等第一个任务执行完之后(i等于4),第二次任务才开始)
2023-03-09 16:12:07.417 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]0===========================
2023-03-09 16:12:12.432 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]1===========================
2023-03-09 16:12:17.448 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]2===========================
2023-03-09 16:12:22.453 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]3===========================
2023-03-09 16:12:27.468 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]4===========================
2023-03-09 16:12:33.481 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]0===========================
2023-03-09 16:12:38.489 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]1===========================
2023-03-09 16:12:43.495 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]2===========================
2023-03-09 16:12:48.498 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]3===========================
2023-03-09 16:12:53.506 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]4===========================
2)如果有多个定时任务,其他的定时任务会阻塞,等第一个定时任务执行完之后再执行其他的定时任务
// 示例2代码
@Scheduled(initialDelay = 1000, fixedDelay = 10000)
void task1() {
for (int i = 0; i < 2; i++) {
log.info("\n======================= task1:{}===========================", Thread.currentThread() + "" + i);
try {
// 休眠5秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Scheduled(initialDelay = 1000, fixedDelay = 10000)
void task2() {
for (int i = 0; i < 2; i++) {
log.info("\n======================= task2:{}===========================", Thread.currentThread() + "" + i);
try {
// 休眠5秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果(task1和task2交替执行,且都是一个线程)
======================= task1:Thread[scheduling-1,5,main]0===========================
2023-03-09 16:21:47.057 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-1,5,main]1===========================
2023-03-09 16:21:48.064 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task2:Thread[scheduling-1,5,main]0===========================
2023-03-09 16:21:49.079 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task2:Thread[scheduling-1,5,main]1===========================
2.若想多个定时任务并发执行,需要在yml里面配置线程池:spring.task.scheduling.pool.size:10(线程池个数),添加配置后,示例2代码执行结果如下:
// task1和task2交替执行,且线程不一样
2023-03-09 16:26:57.920 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task2:Thread[scheduling-1,5,main]0===========================
2023-03-09 16:26:57.920 [scheduling-2] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-2,5,main]0===========================
2023-03-09 16:26:58.925 [scheduling-1] INFO com.storage.intranet.task.UpdateTest -
======================= task2:Thread[scheduling-1,5,main]1===========================
2023-03-09 16:26:58.925 [scheduling-2] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[scheduling-2,5,main]1===========================
3.同一个定时任务当执行时间大于定时任务时间间隔时,若不想使定时任务阻塞,则可以通过在启动类上添加@EnableAsync,且定时任务方法上添加@Async来实现同一个定时任务的并发执行(可以不配置2的线程池),添加注解后,示例1代码(需要在task1方法上添加@Async)执行结果如下:
到达执行时间(1秒后),下一次任务就会执行(且线程不一样)
2023-03-09 16:34:50.976 [task-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[task-1,5,main]0===========================
2023-03-09 16:34:51.990 [task-2] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[task-2,5,main]0===========================
2023-03-09 16:34:52.999 [task-3] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[task-3,5,main]0===========================
2023-03-09 16:34:54.011 [task-4] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[task-4,5,main]0===========================
2023-03-09 16:34:55.024 [task-5] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[task-5,5,main]0===========================
2023-03-09 16:34:55.992 [task-1] INFO com.storage.intranet.task.UpdateTest -
======================= task1:Thread[task-1,5,main]1===========================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律