@Schedule 如何解决定时任务推迟执行

 更新时间:2022年09月30日 16:27:03   作者:Dily_Su  
这篇文章主要介绍了@Schedule 如何解决定时任务推迟执行问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前言

SpringBoot 实现定时任务很简单,只需要使用**@Scheduled**注解即可,但是该注解是实现的定时任务默认是单线程的,也就意味着多个定时任务执行时就可能导致线程堵塞,延缓定时任务的执行。

下面就一步一步来解决这个问题。

一、@Scheduled

1、代码

// 启用定时任务
@EnableScheduling 
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
@Component
public class Task {
    Logger logger = LoggerFactory.getLogger(Task.class);
	// 每五秒执行一次
    @Scheduled(cron = "0/5 * * * * ?")
    public void taskTestA() throws InterruptedException {
        logger.info("A:");
        TimeUnit.SECONDS.sleep(20);
    }
  
    // 每十秒执行一次
    @Scheduled(cron = "0/10 * * * * ?")
    public void taskTestB() {
        logger.info("B:");
    }
}

2、结果

代码

由图可知,首先这两个定时任务都是单线程的,但是当定时A执行了一次后,由于定时A中有个休眠20秒,然后执行定时任务B,所以线程A第二次执行在25秒后才执行,这就是由于@Scheduled定时任务是单线程,造成的线程堵塞,导致定时任务推迟执行。

二、@Scheduled + 配置线程池

1、代码

和前面@Scheduled 相比,仅仅增加了配置线程池

// 若不设置默认为单线程,这里设置使用线程池,大小为4
spring:
  task:
    scheduling:
      pool:
        size: 4

2、结果

由图可知,增加了线程池,这样使得定时任务A和B在不同的线程进行执行,但是定时任务A的第二次执行,依旧是在25秒后执行,由此可知这种方式其实解决的是不同定时任务之间的进程堵塞。

三、@Scheduled + @Async

1、代码

和前面相比,仅仅增加了配置

// 启用异步,动态创建线程
@EnableAsync  
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
@Component
public class Task { 
    Logger logger = LoggerFactory.getLogger(Task.class);
    // 异步,动态创建线程
    @Async
    @Scheduled(cron = "0/5 * * * * ?")
    public void taskTestA() throws InterruptedException {
        logger.info("A:");
        TimeUnit.SECONDS.sleep(20);
    }
    // 异步,动态创建线程
    @Async
    @Scheduled(cron = "0/10 * * * * ?")
    public void taskTestB() {
        logger.info("B:");
    }
}

2、结果

由图可知,启用了异步,使用了spring 默认的线程池,动态创建线程,这样使得定时任务A和B在不同的线程进行执行,同时任务A的多次运行也是异步执行,这样就能确保所有定时任务不会延迟执行!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • idea2020安裝MybatisCodeHelper插件的图文教程

    idea2020安裝MybatisCodeHelper插件的图文教程

    这篇文章主要介绍了idea2020安裝MybatisCodeHelper插件的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Mybatis中resultMap标签和sql标签的设置方式

    Mybatis中resultMap标签和sql标签的设置方式

    这篇文章主要介绍了Mybatis中resultMap标签和sql标签的设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java 超详细讲解类的定义方式和对象的实例化

    Java 超详细讲解类的定义方式和对象的实例化

    Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面对对象的世界里面,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情
    2022-03-03
  • 说说在Spring中如何引用外部属性文件的方法

    说说在Spring中如何引用外部属性文件的方法

    这篇文章主要介绍了说说在Spring中如何引用外部属性文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • mybatis实现获取入参是List和Map的取值

    mybatis实现获取入参是List和Map的取值

    这篇文章主要介绍了mybatis实现获取入参是List和Map的取值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java设计模式之抽象工厂模式简析

    Java设计模式之抽象工厂模式简析

    这篇文章主要介绍了Java设计模式之抽象工厂模式简析, 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象,他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构,需要的朋友可以参考下
    2023-12-12
  • Spring Cloud分布式定时器之ShedLock的实现

    Spring Cloud分布式定时器之ShedLock的实现

    这篇文章主要介绍了Spring Cloud分布式定时器之ShedLock的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java多线程:生产者与消费者案例

    Java多线程:生产者与消费者案例

    这篇文章主要介绍了Java并发编程中的生产者与消费者模型简述,多线程并发是Java编程中最终要的部分之一,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • java中ExecutorService创建方法总结

    java中ExecutorService创建方法总结

    在本篇文章里小编给大家整理了一篇关于java中ExecutorService创建方法总结,有兴趣的朋友们可以参考下。
    2021-01-01
  • 基于Properties类操作.properties配置文件方法总结

    基于Properties类操作.properties配置文件方法总结

    这篇文章主要介绍了Properties类操作.properties配置文件方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论