spring自带的任务调度是串行执行的,串行执行什么意思呢?
就是第一个方法执行完成之后才会执行第二个方法.举个栗子:要是我两个方法都是每一秒执行一次,第一个方法执行时间比较长,那么第二个方法就不是每一秒执行了…但是不同类却是异步的.
@Component
public class Test{
@Scheduled(cron = "0/1 * * * * ?")
public void methodOne() {
log.error("执行方法一...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Scheduled(cron = "0/1 * * * * ?")
public void methodTwo() {
log.error("执行方法二...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在我想,方法一方法二同时执行,则叫做并行.要是我想方法一还在睡眠的时候,并不管他有没有执行完,直接执行下一次的话,那就是方法的异步执行了.使用@Async注解到对应的方法上即可.并行操作的配置类:
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
/**
* 定时任务并行执行
**/
@Configuration
@EnableScheduling
@Slf4j
public class ScheduledConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
TaskScheduler scheduler = this.taskScheduler();
scheduledTaskRegistrar.setTaskScheduler(scheduler);
}
@Bean(destroyMethod = "shutdown")
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setThreadNamePrefix("task-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
}
在执行,发现方法一方法二同时执行的;将setPoolSize设置线程个数,如果设置为1,就代表是串行的,执行就会发现时间很长…一般看定时任务的量,来合理设置size.