java中定时任务 schedule 分布式下没有锁住 时间不同步 执行滞后 相对时间 系统时间 spring springboot

java.util.Timer计时器可以进行:管理任务延迟执行("如1000ms后执行任务"),及周期性执行("如每500ms执行一次该任务")。

但是,Timer存在一些缺陷,应考虑使用ScheduledThreadPoolExecutor代替,Timer对调度的支持是基于绝对时间,而不是相对时间的,由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。

Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。

https://www.cnblogs.com/felixzh/p/11899051.html

今天本地测试定时任务的时候, 修改完本地系统时间,发现到时间后定时任务并没有执行, 经过一番分析调试才发现一个get到一个技能: 如果项目启动后, 修改系统时间则定时任务不会生效, 但是项目若是在修改系统时间后启动 则定时任务到点会执行, 原因是缓存了时间;

但是经过一些搜集发现,修改系统时间的定时任务问题也分情况: Timer类的调度是基于绝对的时间的,而不是相对的时间,因此Timer类对系统时钟的变化是敏感的,举个例子,假如你希望任务1间隔10秒执行一次,某个时刻,你将系统时间提前了6秒,那么任务1就会在4秒后执行,而不是10秒后。在 ScheduledThreadPoolExecutor中任务的调度是基于相对时间的,原因是它在任务的内部 存储了该任务距离下次调度还需要的时间(使用的是基于 System#nanoTime实现的相对时间 ,不会因为系统时间改变而改变,如距离下次执行还有10秒,不会因为将系统时间调前6秒而变成4秒后执行, 相当于是缓存了系统时间)。

Spring定时任务之修改系统时间问题_zhanglq1202的博客-CSDN博客

配置线程池。因为默认是单线程。会因为Thead.sleep()阻塞。

java 复制代码
spring:
  task:
    scheduling:
      pool:
        size: 10

@EnableAsync+@Async是让当前方法异步。例如当前方法是每秒执行一次,但因为阻塞了,就不会再每秒执行。 给方法加上@Async,就可以继续每秒执行。

@Schedule 解决定时任务推迟执行_@sechedule 每5秒_Dily_Su的博客-CSDN博客

相关推荐
奇牙coding1 分钟前
Codex C接 配置教程:的 字段从迁移时必须写完整后缀,填旧值或省略 会静默回退默认模型
java·c语言·数据库·ai
卓怡学长10 分钟前
w193基于springboot“乐通黄骅”电动车智能充电服务小程序
java·spring boot·spring·小程序·intellij-idea
j7~19 分钟前
【C++标准项目】C++基于protobuf的发布订阅式消息队列(篇一):项目概述+环境搭建
分布式·消息队列·rabbitmq·gtest·protobuf·muduo·sqlites
谢亮_vipxieliang32 分钟前
GC 入门:G1 与 ZGC 怎么选
java·jvm·算法
Cc.Y5 小时前
Java零基础入门:字符串深度掌握——从基础API到StringBuilder性能优化
java·开发语言·性能优化
shuoshuohaohao9 小时前
MyBatis 小知识点
java·spring·mybatis
海上小飞龙9 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
谢亮_vipxieliang10 小时前
泛型擦除、通配符与 PECS 一次讲透
java·面试
八解毒剂10 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
打工仔折腾 AI11 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战