@Scheduled 來設定排程時,Spring內部其實偷偷將其管交給了 TaskScheduler 來運作(像是計時cron、觸發trigger)。TaskScheduler 是Spring設計用於排程的一個介面,而一般預設使用的實作類別是 ThreadPoolTaskScheduler,很熟悉吧~ScheduledExecutorService!BANG!@Async 作為使用TaskExecutor實作的一個方式(.execute)。這個我先不深入研究,先單就TaskExecutor與ThreadPoolTaskScheduler的關係為主。@Scheduled(fixedRate = 5000L)
public void reportCurrentTime_1() {
log.info("Schedule_1 reportTime : {}", dateFormat.format(new Date()));
}
@Scheduled(fixedRate = 2000L)
public void reportCurrentTime_2() {
log.info("Schedule_2 reportTime : {}", dateFormat.format(new Date()));
}
2026-08-08T21:34:07.008+08:00
INFO 25876 --- [mall] [scheduling-1] org.system.task.ScheduleTask : Schedule_1 reportTime : 21:34:07
2026-08-08T21:34:07.009+08:00
INFO 25876 --- [mall] [scheduling-1] org.system.task.ScheduleTask : Schedule_2 reportTime : 21:34:07
spring.task.scheduling.pool.size=2
2026-08-08T21:38:08.775+08:00
INFO 3212 --- [mall] [scheduling-2] org.system.task.ScheduleTask : Schedule_1 reportTime : 21:38:08
2026-08-08T21:38:08.775+08:00
INFO 3212 --- [mall] [scheduling-1] org.system.task.ScheduleTask : Schedule_2 reportTime : 21:38:08
@Scheduled 時,要注意執行緒的default是1,因此需要再注意多排程的設定!TaskScheduler 注重 任務的觸發與時間。TaskExecutor 注重 執行緒的調度與執行!ThreadPoolTaskSchedule 作為 @Schedule 的預設實作則 綜合了兩者的概念!本篇文章出自《每天學Java直到今年結束》Day220,大家可以到我的網站上查看~