解决SpringBoot中的Scheduled单线程执行问题

 更新时间:2022年06月30日 17:16:08   作者:老司机张师傅  
在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败,这篇文章主要介绍了SpringBoot中的Scheduled单线程执行问题及解决方法,需要的朋友可以参考下

问题描述

在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败。
类似于以下模拟场景,test1定时任务模拟有五秒钟执行时间,这时会同步影响到test2任务的执行,导致test2任务也变成五秒执行一次。

    @Scheduled(fixedRate = 1000)
    public void test1() throws InterruptedException {
        log.info(Thread.currentThread().getName() + " | task01 ");
        Thread.sleep(5000);
    }

    @Scheduled(fixedRate = 2000)
    public void test2() {
        log.info(Thread.currentThread().getName() + " | task02 ");
    }

原因分析:

经过相关资料查阅,发现Scheduled定时任务默认的线程数只有一个,进行定时任务调度时会同步的去调度,一个执行完成后再执行另一个,这是导致该问题的直接原因。

解决方案:

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        // 设置线程数量
        taskScheduler.setPoolSize(50);
        return taskScheduler;
    }

添加一个配置,设置TaskScheduler线程数为多个,这样再执行时就会异步执行了,各个定时任务间互不影响。

补充:

使用以下Java的util包中带的TimerTask也可以进行定时任务的执行。
以下参数中TimerTask是执行的任务,0表示第一次延迟0秒执行,3000表示每3000毫秒执行一次。

						// true表示定时任务创建为守护线程
                        Timer timer = new Timer(true);
                        //timer.scheduleAtFixedRate();
                        timer.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                logger.info(Thread.currentThread().getName() + "************"+ftpGaFilePrefix);
                            }
                        }, 0, 3000);

到此这篇关于SpringBoot中的Scheduled单线程执行的文章就介绍到这了,更多相关SpringBoot Scheduled单线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot Redisson 集成的实现示例

    SpringBoot Redisson 集成的实现示例

    本文主要介绍了SpringBoot Redisson 集成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • JAVA字符串反转的三种方法

    JAVA字符串反转的三种方法

    这篇文章主要介绍了JAVA字符串反转的三种方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • Java NIO实例UDP发送接收数据代码分享

    Java NIO实例UDP发送接收数据代码分享

    这篇文章主要介绍了Java NIO实例UDP发送接收数据代码分享,分享了客户端和服务端完整代码,小编觉得还是挺不错的,共需要的朋友参考。
    2017-11-11
  • 浅析Java的Spring框架中IOC容器容器的应用

    浅析Java的Spring框架中IOC容器容器的应用

    这篇文章主要介绍了Java的Spring框架中IOC容器容器的应用,包括BeanFactory容器和ApplicationContext容器的介绍,需要的朋友可以参考下
    2015-12-12
  • SpringBoot连接Redis2种模式解析

    SpringBoot连接Redis2种模式解析

    这篇文章主要介绍了SpringBoot连接Redis2种模式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java Character类对单个字符操作原理解析

    Java Character类对单个字符操作原理解析

    这篇文章主要介绍了Java Character类对单个字符操作原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringMVC上传文件并保存到本地代码实例

    SpringMVC上传文件并保存到本地代码实例

    这篇文章主要介绍了SpringMVC上传文件并保存到本地代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 聊聊@RequestBody和Json之间的关系

    聊聊@RequestBody和Json之间的关系

    这篇文章主要介绍了@RequestBody和Json之间的关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java中文分词之正向最大匹配法实例代码

    java中文分词之正向最大匹配法实例代码

    中文分词应用很广泛,网上也有很多开源项目,下面这篇文章主要给大家介绍了关于java中文分词之正向最大匹配法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • MyBatis动态SQL foreach标签实现批量插入的方法示例

    MyBatis动态SQL foreach标签实现批量插入的方法示例

    这篇文章主要介绍了MyBatis动态SQL foreach标签实现批量插入的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论