@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;
    }

}
原创文章 10 获赞 3 访问量 2526

猜你喜欢

转载自blog.csdn.net/NestorBian/article/details/105187166