TaskScheduler 任务调度者
TaskExecutor 任务执行者
@EnableScheduling 开启定时任务功能,方法所在类需要加@Component
@Scheduled(Cron= “”) 指定执行的时间
@Scheduled(cron = "0/1 * * * * ? ") @Override public Result ScanUserState() throws InterruptedException { Thread.sleep(5000); System.out.println("执行了"); return new Result(); }
定时任务,只有一个线程去执行任务,任务间隔是1000毫秒,执行任务需要5000毫秒,那么任务的执行周期是1000+5000=6000毫秒。就算线程池中有多个线程,也会等那个任务执行完再选取一个线程再次执行任务。
如果同时开启了@EnableAsync和使用了@Async,如果执行时间大于Cron表达式的时间,则会选取线程池中其他的线程立刻去执行任务,如果没有剩余线程,则会等待有线程空闲出来。
@Configuration public class ScheduleConfig implements SchedulingConfigurer,AsyncConfigurer { //并行任务 public void configureTasks(ScheduledTaskRegistrar taskRegistrar){ TaskScheduler taskScheduler = taskScheduler(); taskRegistrar.setTaskScheduler(taskScheduler); } //并行任务使用策略:多线程处理(配置线程数等) @Bean("task1") public ThreadPoolTaskScheduler taskScheduler(){ ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(20); scheduler.setThreadNamePrefix("task-"); //设置线程名开头 scheduler.setAwaitTerminationSeconds(60); scheduler.setWaitForTasksToCompleteOnShutdown(true); return scheduler; } //异步任务 public Executor getAsyncExecutor(){ Executor executor = taskScheduler(); return executor; } //异步任务 异常处理 public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler(){ return new SimpleAsyncUncaughtExceptionHandler(); } }
@Async("task1") @Scheduled(cron = "0/1 * * * * ? ") @Override public Result ScanUserState() throws InterruptedException { Thread.sleep(5000); System.out.println("执行了"); return new Result(); // return LoginDao.ScanUserState(); }