添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
温暖的便当  ·  Configure anonymous ...·  1 年前    · 
豪情万千的楼梯  ·  Deploy applications ...·  1 年前    · 
2.1 首先这里创建了一个普通的SpringBoot项目叫SpringbootApplication,在启动类上添加@EnableSchedling注解
@SpringBootApplication
@EnableScheduling
public class SpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
		2.2 创建定时任务调度类TestSchedule,并定义taskSchedule1方法使用@Scheduled(cron = "0/10 * * * * ?")标注,表示该方法从0秒开始,每隔10秒执行一次,方法内部获取了执行当前任务的线程,打印了任务开始和结束的时间、线程ID、线程的名字,sleep 5秒表示任务执行完成需要花费5秒时间。使用@Component注解,交给Spring容器管理。
@Component
public class TestSchedule {
    @Scheduled(cron = "0/10 * * * * ?")
    public void taskSchdule1() throws InterruptedException {
        Thread t = Thread.currentThread();
        System.out.println("taskSchule1 "+ new Date().toLocaleString() +" ThreadID:"+ t.getId() +" "+t.getName());
        Thread.sleep(5000);
        System.out.println("taskSchule1 end "+ new Date().toLocaleString() +" ThreadID:"+ t.getId() +" "+t.getName());
		2.3 运行结果
		到这里最简单的定时任务调度就算完成了,启动项目,打印结果如下:
@Scheduled(cron = "0/3 * * * * ?")
public void taskSchdule2(){
    Thread t = Thread.currentThread();
    System.out.println("taskSchule2 "+ new Date().toLocaleString() +" ThreadID:"+  t.getId() +" "+t.getName());
		再次运行,结果如下:
		观察发现任务2正常执行,但是任务1中a、b和c、d两组出现了交叉,两组是不同线程执行的,因为任务1的执行时间超过了调度时间,所以,a处开始执行,在未执行完成的情况下,任务的调度时间到了,其他线程又立马调度了任务从c处开始执行。
		这是使用@EnableAsync和@Async可能会出现的问题。
		6. 解决坑1和坑2 
		再次修改代码,去掉5中的@EnableAsync和@Async注解,去掉2中的@EnableScheduling注解,
		创建一个任务配置类ScheduleConfig 实现SchedulingConfigurer接口的configureTasks方法,使用参数taskRegistrar为任务调度创建线程池
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
		运行程序结果如下:
		SpringBoot中可以使用@EnableScheduling和@Scheduled注解实现定时任务调度,但是注意默认所有任务都被单个线程调度的,有可能任务之间发生阻塞现象,可以使用@EnableAsync和@Async注解实现异步多线程任务调度,但需要注意任务执行时间如果大于任务调度周期时间,可能出现同一个任务交叉执行的情况。当然也可以使用第6步中的方法避免上述问题。
最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!
•001:《Kafka面试专题及答案》;•002:《Spring面试专题及答案》•003:《阿里工程师的自我修养》•004:《JAVA核心面试知识整理》•005:《阿里巴巴Java开发手册(华山版)》•006:《DDD速成(领域驱动设计速成)》•007:《SQL经典实例》•008:加小编微信
		推荐阅读: