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();
}