定时任务@Scheduled 和 异步@Async

2023-02-16 15:16:21 浏览数 (1)

TaskScheduler 任务调度者 TaskExecutor 任务执行者

@EnableScheduling 开启定时任务功能,方法所在类需要加@Component @Scheduled(Cron= “”) 指定执行的时间

代码语言:javascript复制
	@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表达式的时间,则会选取线程池中其他的线程立刻去执行任务,如果没有剩余线程,则会等待有线程空闲出来。

代码语言:javascript复制
@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();
    }
}
代码语言:javascript复制
  	@Async("task1")
    @Scheduled(cron = "0/1 * * * * ? ")
    @Override
    public Result ScanUserState() throws InterruptedException {
        Thread.sleep(5000);
        System.out.println("执行了");
        return new Result();
        // return LoginDao.ScanUserState();
    }

0 人点赞