注意:默认线程池是一个线程,即多任务调度会串行执行
方式一:
@Configuration
public class ScheduleConfig {
/**
* 修复同一时间无法执行多个定时任务问题。@Scheduled默认是单线程的
*/
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
//核心线程池数量,方法: 返回可用处理器的Java虚拟机的数量。
taskScheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 2);
return taskScheduler;
}
}
方式二:
spring:
task:
scheduling:
pool:
size: 8 #配置Scheduled定时任务为多线程
方式三:
@Configuration
public class ScheduleConfig1 implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setScheduler(
new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2)
);
}
}
这里有的小伙伴说@EnableAsync @async @schedule一起使用,多任务是并行,但该方法会导致同一个任务,即使上一次执行还未完成,只要时间到就会再次执行该任务
如果任务执行顺序对结果没有影响可以用
如果单个任务执行有顺序之分,这种方式会导致结果的不准确
定时时间:
@Component
@Lazy(value=false)
@EnableScheduling
public class MyQuartzs {
@Scheduled(cron = "*/5 * * * * ?")//每隔5秒执行一次
public void test() throws Exception {
System.out.println("Test is working......");
}
}
Spring TaskExecutor与TaskScheduler
Spring Scheduler 与 Quartz 进阶