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博客

相关推荐
IT学长编程5 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
IT学长编程22 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
小小娥子27 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
DieSnowK28 分钟前
[Redis][集群][下]详细讲解
数据库·redis·分布式·缓存·集群·高可用·新手向
几何心凉34 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
华农第一蒟蒻37 分钟前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
两点王爷38 分钟前
使用WebClient 快速发起请求(不使用WebClientUtils工具类)
java·网络
计算机学姐1 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
平凡的小码农1 小时前
JAVA实现大写金额转小写金额
java·开发语言
一直在进步的派大星1 小时前
Docker 从安装到实战
java·运维·docker·微服务·容器