问题:cron时间设置得很接近的那些任务,很有可能在同一个时刻一起触发,触发的时候执行是在同一个"线程"内执行的,很有可能会造成有些任务延迟执行!
接近方案:以线程池-多线程的方式开启 多任务-多线程 执行!
创建一个配置类,线程池,可以返回一个bean
//任务-线程池-调度配置
@Configuration
public class ThreadConfig {
@Bean("taskExecutor")
public Executor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数
executor.setCorePoolSize(5);
//最大核心线程数
executor.setMaxPoolSize(10);
//设定队列等待的被调度的任务的数量
executor.setQueueCapacity(5);
return executor;
}
}
让所有的任务异步执行 @Async("指定的线程池")
@Scheduled(cron = CRON)
@Async("taskExecutor")
public void schedulerOne(){
log.info("----当定时任务1");
try {
Thread.sleep(2000);
}catch (Exception e){
}
}
@Scheduled(cron = CRON)
@Async("taskExecutor")
public void schedulerTwo(){
log.info("----当定时任务2");
try {
Thread.sleep(2000);
}catch (Exception e){
}
}
@Scheduled(cron = CRON)
@Async("taskExecutor")
public void schedulerThree(){
log.info("----当定时任务3");
try {
Thread.sleep(2000);
}catch (Exception e){
}
}
运行结果:每个任务由不同的线程ID去执行