SpringBoot中定时任务@Scheduled的多线程如何使用
更新时间:2023-11-06前言:
在Spring Boot中,可以使用@Scheduled注解来实现定时任务。默认情况下,@Scheduled注解是在单个线程中执行,即串行执行。但是,当定时任务的执行时间较长,或者需要同时执行多个定时任务时,串行执行会导致任务阻塞,影响系统的性能和响应时间。因此,我们可以通过多线程的方式来并行执行定时任务,提高系统的吞吐量和并发性能。使用多线程执行定时任务的步骤:
1. 创建一个配置类,用于配置线程池和定时任务的线程池执行器;
@Configuration @EnableScheduling public class TaskThreadPoolConfig implements SchedulingConfigurer { private final int corePoolSize = 10; private final int maxPoolSize = 20; private final int queueCapacity = 100; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.initialize(); taskScheduler.setPoolSize(corePoolSize); taskScheduler.setMaxPoolSize(maxPoolSize); taskScheduler.setThreadNamePrefix("scheduled-task-"); taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); taskScheduler.setAwaitTerminationSeconds(60); taskScheduler.setWaitForTasksToCompleteOnShutdown(true); taskScheduler.setBeanName("taskScheduler"); taskScheduler.setThreadGroupName("scheduled-task-group"); taskRegistrar.setTaskScheduler(taskScheduler); } }2. 在定时任务的方法上添加@Async注解,表示该方法为异步方法,将会在新的线程中执行;
@Service public class MyTaskService { @Async @Scheduled(fixedRate = 5000) public void myTask() { // 定时任务逻辑代码 } }3. 在应用主类中添加@EnableAsync注解,启用异步执行;
@SpringBootApplication @EnableAsync public class SpringBootApp { public static void main(String[] args) { SpringApplication.run(SpringBootApp.class, args); } }
多线程执行定时任务的注意事项:
1. 使用多线程执行定时任务时,要注意线程安全性,避免出现竞态条件等问题; 2. 在定时任务方法上使用@Async注解时,一定要注意返回值类型为void,否则将无法获取到异步方法的执行结果; 3. 在异步方法中,无法使用Spring容器的自动注入,如果需要使用依赖注入,可以通过构造方法、属性注入或者使用@Configurable注解解决; 4. 线程池的配置参数需要根据实际情况进行调优,避免线程池过大或过小导致的性能问题。