Timer是JAVA自带的定时任务类,实现如下:
Timer 优缺点分析
优点是使用简单,缺点是当添加并执行多个任务时,前面任务的执行用时和异常将影响到后面任务,这边深海建议谨慎使用。
二、ScheduledExecutorServiceScheduledExecutorService 也是Java自带的类,
它可以实现Timer具备的所有功能,并解决了 Timer类存在的问题。
实现如下:
ScheduledExecutorService 优缺点分析
优点是,该类是JDK1.5自带的类,使用简单,缺点是该方案仅适用于单机环境。
三、Spring TaskSpring系列框架中Spring Framework自带的定时任务,
使用上面两种方式,很难实现某些特定需求,比如每周一执行某任务,但SpringTask可轻松实现。
以SpringBoot为例来实现:
1、开启定时任务在SpringBoot的启动类上声明 @EnableScheduling:
2、添加定时任务只需使用@Scheduled注解标注即可,
如果有多个定时任务,可以创建多个@Scheduled标注的方法,示例如下:
Spring Boot 启动后会自动加载并执行定时任务,无需手动操作。
Cron 表达式Spring Task 的实现需要使用 cron 表达式来声明执行的频率和规则,cron 表达式是由 6 位或者 7 位组成的(最后一位可以省略),每位之间以空格分隔,每位从左到右代表的含义如下:
其中 * 和 ? 号都表示匹配所有的时间。
cron 表达式在线生成地址:https://cron.qqe2.com/
知识扩展:分布式定时任务上面的方法都是关于单机定时任务的实现,如果是分布式环境可以使用 Redis 来实现定时任务。
使用 Redis 实现延迟任务的方法大体可分为两类:通过 ZSet 的方式和键空间通知的方式。
1、ZSet 实现方式通过 ZSet 实现定时任务的思路是,将定时任务存放到 ZSet 集合中,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行,具体实现代码如下:
2、键空间通知我们可以通过 Redis 的键空间通知来实现定时任务,它的实现思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。
默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启,开启之后定时任务的代码如下:
总结到此这篇关于Java实现定时任务最简单的3种方法的文章就介绍到这了,更多相关Java定时任务实现内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!