@EnableScheduling和@Scheduled定义的调度是单线程执行?
@Scheduled定义的调度真的是单线程执行的吗?
查看源码
@ConfigurationProperties("spring.task.scheduling") public class TaskSchedulingProperties { private final TaskSchedulingProperties.Pool pool = new TaskSchedulingProperties.Pool(); ... ... public static class Pool { private int size = 1; public Pool() { } public int getSize() { return this.size; } public void setSize(int size) { this.size = size; } } }
由此可见spring提供的调度器是默认采用单线程的线程池。 这样会导致如果一个定时任务发生阻塞,将会影响其他定时任务的执行,因此我们需要配置多线程执行来解决此问题。
多线程解决方案
Spring Boot工程
application.properties中添加如下配置即可
spring.task.scheduling.pool.size=10 spring.task.scheduling.thread-name-prefix=schedule-test
Spring工程
添加java配置即可
/** * 配置spring定时任务多线程执行默认单线程 * 两个方法只需配置一个即可 * springboot还可以通过配置文件配置 */ @Configuration public class SchedulerConfig { // 方法1 配置TaskScheduler @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(10); threadPoolTaskScheduler.setRemoveOnCancelPolicy(true); threadPoolTaskScheduler.setThreadNamePrefix("schedule-pool-"); threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true); return threadPoolTaskScheduler; } // 方法2 配置定时任务线程池 @Bean public ScheduledExecutorService scheduledExecutorService() { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10); return scheduledExecutorService; } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
免费的ChatGPT镜像网站