c语言编程笔录

首页 >   > 笔记大全

笔记大全

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. 线程池的配置参数需要根据实际情况进行调优,避免线程池过大或过小导致的性能问题。

总结:

使用多线程执行定时任务可以提高系统的并发性能和响应时间。通过在定时任务方法上添加@Async注解,并在应用主类中添加@EnableAsync注解,可以将定时任务放入线程池中并行执行。但要注意线程安全性和注入问题,并合理调整线程池的配置参数。这样,就可以充分利用多核处理器的性能,提高系统的吞吐量和并发能力。