spring 定时任务,单次执行时间超过fixedRate时的实际效果

1. 单线程执行时,fixedRate失效,实际执行频率与实际执行时间一致。

2. 定时任务加上@Async 或者定时任务调用加上@Async注解的service方法时,实际执行频率与fixedRate一致。

// 定时任务
@Scheduled(fixedRate=1000)
public void callAsyncService(){
    asyncService.printConsumedTime();  
}
// service
@Async
public void printConsumedTime(){
    try{
        StopWatch sw = new StopWatch();
        long starttime = System.currentTimeMillis();
        sw.start();
        Thread.sleep(3000);
        sw.stop();
        System.out.println(Thread.currentThread().getName() + " start time:"+starttime+"last time :"+sw.getTotalTimeMillis());

    }catch(InterruptedException e){

    }
}

 3. 当加上@Async但是线程不够用时,实际执行频率也不能按照fixedRate来执行。

// 配置定时任务的线程池
@Configuration
public class ScheduleConfig implements SchedulingConfigure {
    @Bean
    public Executor taskSchedulerExecutor(){
        ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
          executor.setPoolSize(2);
          executor.setThreadNamePrefix("threadTaskScheduler");
          executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
          return executor;
    }  
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
        taskRegistrar.setScheduler(taskSchedulerExecutor());
    }
}    

同样执行上面的任务。同一个线程就不能按fixedRate执行。

posted @ 2023-02-23 11:13  /*小神经*/  阅读(181)  评论(0)    收藏  举报