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


相关推荐

发表回复

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

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