scheduleAtFixedRate()踩的坑

scheduleAtFixedRate()踩的坑公司有个定时任务 跑了 10 天挂了 看日志没有任何的错误信息 查找一番发现问题所在 记录一下 一直以为 scheduleAtFi 和 scheduleWith 这两个方法的区别是 scheduleWith 是延迟任务 scheduleAtFi 是定时任务 ScheduledExe

公司有个定时任务,跑了10+天挂了,看日志没有任何的错误信息,查找一番发现问题所在,记录一下。

一直以为scheduleAtFixedRate()和scheduleWithFixedDelay()这两个方法的区别是,scheduleWithFixedDelay()是延迟任务,scheduleAtFixedRate()是定时任务:

 ScheduledExecutorService services = Executors.newScheduledThreadPool(2); //scheduleWithFixedDelay services.scheduleWithFixedDelay(new MyRunnable(), 10, 2 * 60, TimeUnit.SECONDS); //scheduleAtFixedRate services.scheduleAtFixedRate(new MyRunnable(), 10, 2 * 60, TimeUnit.SECONDS);

我的理解是:scheduleWithFixedDelay()定时任务会在10秒之后开始第一次执行,等到上一次任务执行完后,延迟120秒执行第二个任务;scheduleAtFixedRate()定时任务会在10秒后执行,等到120秒后,不管上一次任务是否执行完成,直接开始执行第二次任务。(错误的理解


scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别,看了大佬的博客才知道,我的理解有点问题:

scheduleAtFixedRate ,是以上一个任务开始的时间计时,120秒过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。

scheduleWithFixedDelay,是以上一个任务结束时开始计时,120秒过去后,立即执行。


加上另外一个大佬的博客,找到了问题所在,Java定时线程池停止超时任务。博客里面提到了:

关于定时线程池,好多人认为设置好频率(比如1Min),它会按照这个间隔按部就班的工作。但是,如果其中一次调度任务卡住的话,不仅这次调度失败,而且整个线程池也会停在这次调度上。


回头看了下代码,整个定时任务完全没有try…catch…异常,而最后一次连接数据库时出现了某种异常,导致以后的调度任务全部失效(上一任务没有完成),最后导致整个定时任务死掉了。。。

知道了原因,解决起来就好办了,在线程的run()方法里面用try…catch…fianlly…包围

 @Override public void run() { try { //初始化数据库 Jedis bns3Redis= MyJedisPool.getRedis(); if (null == bns3Redis) { logger.error("init jedis failed"); } //do sth startHandle(bns3Redis); } catch (Exception e) { e.printStackTrace(); logger.error("exception:" + e.getMessage()); } finally { if (null != bns3Redis) try { bns3Redis.close(); } catch (Exception e) { logger.error("close redis exception:" + e.getMessage()); bns3Redis = null; } } logger.info("=====updateTime======" + updateTime); }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210676.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:08
下一篇 2026年3月19日 上午7:09


相关推荐

  • python闭包详解_python闭包主要解决什么问题

    python闭包详解_python闭包主要解决什么问题闭包首先了解一下:如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用

    2022年7月28日
    6
  • circos 可视化手册- text 篇

    circos 可视化手册- text 篇欢迎关注微信公众号 生信修炼手册 不论是 heatmap 还是 scatter histogram 反应的都是基因组上某段区域对应的 value 值的分布 这里的 value 都是数值 对于 value 是字符串的情况 专门定义了 text 这种图表类型 用于展示 看一个 text 的实例 text 在图上就是一圈的字符串标记 字符串可以添加连线 表明对应的染色体位置 配置文件的写法如下 首先看下 fil

    2025年6月15日
    4
  • 常见的反爬虫和应对方法「建议收藏」

    常见的反爬虫和应对方法「建议收藏」常见的反爬虫和应对方法

    2022年4月20日
    36
  • nagios配置过程详解

    nagios配置过程详解一 nagios 配置过程详解 1 nagios 默认配置文件介绍 nbsp nagios 安装完毕后 默认的配置文件在 usr local nagios etc 目录下 每个文件或目录含义如下表所示 nbsp 2 配置文件之间的关系 nbsp 在 nagios 的配置过程中涉及到的几个定义有 主机 主机组 服务 服务组 联系人 联系人组 监控时间 监控命令等 从这些定义可以看出 nagios 各

    2026年3月26日
    2
  • 使用HttpClient4实现文件上传请求的发送,服务器端以MultipartFile形式接收(附依赖jar包地址)

    使用HttpClient4实现文件上传请求的发送,服务器端以MultipartFile形式接收(附依赖jar包地址)今天学习使用了HttpClient4.2向服务端发送上传文件的请求,由于服务器端以MultipartFile形式接收,查询资料后决定使用HttpClient4.2实现,以下是实现代码(仅作测试使用):publicvoidtesttaskPost()throwsException{HttpClienthttpclient=newDefaultHttpClien

    2022年7月22日
    20
  • url 转码 java_URL 转码遇到的坑

    url 转码 java_URL 转码遇到的坑1 背景做图片中心时 需要根据图片 URL 去下载图片 发现部分 URL 浏览器里面能访问 但是代码无法下载原因 需要对 URL 进行转码 2 使用 UrlEncode 一开始直接使用 UrlEncode 对 url 转码 如下原始链接 https s3 amazonaws com fromfactory club image 9f 0f 9fbd598cf637 w

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号