@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镜像网站 
			          
			        