ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
默认情况下 Spring 是单线程来跑所有的定时任务,即任务是串行的,任务 B 必须等到任务 A 执行完成后才能得到执行。 ```java @Scheduled(cron = "10 0/1 * * * ?") public void timerJobA() { log.info("[timerJobA]: {}", Thread.currentThread().getName()); try { //每1min10s跑一次,一次需要30s跑完 Thread.sleep(30 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } @Scheduled(cron = "20 0/1 * * * ?") public void timerJobB() { //每1min20s跑一次 log.info("[timerJobB]: {}", Thread.currentThread().getName()); } ``` ``` 打印如下日志,可以看到是同一个线程在跑两个定时任务。 任务 B 应该在 22:23:20、22:24:20、22:25:20 这些时间点上跑,但实际不是, 因为它要等任务 A 跑完才能开始跑。 2023-12-15 22:23:10 ...: [timerJobA]: scheduling-1 2023-12-15 22:23:40 ...: [timerJobB]: scheduling-1 2023-12-15 22:24:10 ...: [timerJobA]: scheduling-1 2023-12-15 22:24:40 ...: [timerJobB]: scheduling-1 2023-12-15 22:25:10 ...: [timerJobA]: scheduling-1 2023-12-15 22:25:40 ...: [timerJobB]: scheduling-1 ``` <br/> 如果想让定时任务并行执行,可以配置线程池,可以选择下面两种配置方式之一。 **1. 代码中配置线程池** ```java @Configuration public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); } } ``` **2. 配置文件中配置** ```yml ###任务调度线程池 #任务调度线程池大小,默认 1 spring.task.scheduling.pool.size: 5 #true-线程池关闭时等待所有任务完成,默认false spring.task.scheduling.shutdown.await-termination: true #调度线程关闭前最大等待时间,确保最后一定关闭 spring.task.scheduling.shutdown.await-termination-period: 20s ###任务执行线程池配置 #true-允许核心线程超时。这样可以动态增加和缩小线程池 spring.task.execution.pool.allow-core-thread-timeout: true #核心线程池大小,默认 8 spring.task.execution.pool.core-size: 10 #线程空闲等待时间 默认 60s spring.task.execution.pool.keep-alive: 60s #线程池最大数 spring.task.execution.pool.max-size: 20 #线程池队列容量大小 spring.task.execution.pool.queue-capacity: 10 #true-线程池关闭时等待所有任务完成 spring.task.execution.shutdown.await-termination: true #执行线程关闭前最大等待时间,确保最后一定关闭 spring.task.execution.shutdown.await-termination-period: 20s ``` ``` 配置线程池后控制台打印如下日志,可以看到任务 B 不必等到任务 A 跑完才开始跑了, 做到了任务的并行执行。 2023-12-16 14:16:10 ...: [timerJobA]: scheduling-2 2023-12-16 14:16:20 ...: [timerJobB]: scheduling-3 2023-12-16 14:17:10 ...: [timerJobA]: scheduling-2 2023-12-16 14:17:20 ...: [timerJobB]: scheduling-1 2023-12-16 14:18:10 ...: [timerJobA]: scheduling-2 2023-12-16 14:18:20 ...: [timerJobB]: scheduling-1 ```