SpringBoot设置多线程执行定时任务
问题描述
SpringBoot定时任务默认都是使用单线程执行的,如果有多个定时任务同时执行的话,那么就可能会导致很多任务无法按时准确执行。
单线程定时任务示例:
代码片
:
@Component
public class TaskTest {
/**
* @描述 定时任务111设置为每天16:20:00执行
* @param
* @作者 swzhu
* @时间 2020/4/16 16:17
* @return void
**/
@Scheduled(cron = "0 20 16 * * ?")
public void test(){
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
System.out.println("定时任务111执行开始!开始时间:" + format.format(new Date()));
try {
Thread.sleep(5000);
} catch (Exception e){
e.printStackTrace();
}
System.out.println("定时任务111执行结束!结束时间:" + format.format(new Date()));
}
/**
* @描述 定时任务222设置为每天16:20:00执行
* @param
* @作者 swzhu
* @时间 2020/4/16 16:17
* @return void
**/
@Scheduled(cron = "0 20 16 * * ?")
public void test2(){
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
System.out.println("定时任务222执行开始!开始时间:" + format.format(new Date()));
System.out.println("定时任务222执行结束!结束时间:" + format.format(new Date()));
}
}
单线程执行结果
:
可以看到,两个定时任务设置的都是16:20:00执行。但实际上,定时任务222是等定时任务111执行结束后才执行的。
设置定时任务为多线程
方法一
添加一个配置类,定时任务类和方法不用做任何改变。
代码片
:
@Configuration
public class ScheduledConfig {
/**
* @描述 所有的定时任务都放在一个线程池中,定时任务启动时使用不同的线程
* @param
* @作者 swzhu
* @时间 2020/4/16 11:47
* @return org.springframework.scheduling.TaskScheduler
**/
@Bean
public TaskScheduler taskScheduler(){
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
// 设置scheduler执行线程为5个
scheduler.setPoolSize(5);
return scheduler;
}
}
方法二
添加一个配置类,实现SchedulingConfigurer接口,重写configureTasks方法,定时任务类和方法不用做任何改变。
代码片
:
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
/**
* @描述 所有的定时任务都放在一个线程池中,定时任务启动时使用不同的线程
* @param
* @作者 swzhu
* @时间 2020/4/16 11:47
* @return
**/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//设定一个定时任务线程池,数量为5
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
}
}
多线程执行结果
:
可以看到,设置定时任务为多线程之后,定时任务222并没有等待定时任务111执行完才执行,而是和定时任务111同时执行。