В платформе Spring одна запланированная задача выполняется только одним потоком, если время выполнения превышает интервальный период. Задание будет отложено. Вот простой пример:
@Scheduled(cron = "0/3 * * * * *")
public void work() {
log.info("begin to do some work,current thread is {}", Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
log.error(e.toString());
}
}
Я создаюзапланированное задание, ожидаемая последовательность выполнения: 0 3 6 9 ..., но заданию требуется больше времени, поэтому последовательность выполнения: 0 6 12 18 ...
Весной все задачи будут выполняться в потоке(по умолчанию), чтобы уменьшить помехи между задачами, мы можем поддерживать пул потоков для выполнения запланированных задач, например:
@Bean
public ThreadPoolTaskScheduler taskExecutor() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
return scheduler;
}
Другой вопрос о запланированной задаче весной: Spring @Scheduled аннотированметоды запускаются в разных потоках?