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===========================

 

posted @ 2023-03-09 16:41  Kavins  阅读(1341)  评论(0编辑  收藏  举报