前言

定时任务 一般会存在 中大型企业级 项目中,为了减少 服务器数据库 的压力,往往会以 定时任务 的方式去完成某些业务逻辑。

常见的就是 金融服务系统 推送回调,一般支付系统订单在没有收到成功的回调返回内容时会 持续性的回调,这种回调一般都是 定时任务 来完成。

还有就是 报表的生成,我们一般会在客户 访问量小 时完成这个操作,也可以采用 定时任务 来完成。




Java 手写定时任务 java定时任务底层原理_java定时任务


正文

定时任务的几种方式

Timer

这是 Java 自带的 java.util.Timer 类,这个类允许调度一个名为 java.util.TimerTask 任务。使用这种方式可以让你的程序按照某一个 频度 执行,但不能在 指定时间 运行。现在一般用的较少。

ScheduledExecutorService

JDK 自带的一个类,是基于 线程池 设计的定时任务类,每个 调度任务 都会分配到 线程池 中的一个 线程 去执行。也就是说,任务是 并发执行,互不影响的。

Spring Task

Spring 3.0 以后自带的 Task,支持 多线程 调度,可以将它看成一个 轻量级 的 Quartz,而且使用起来比 Quartz 简单许多,但是适用于 单节点定时任务调度

Quartz

这是一个 功能比较强大 的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来 稍显复杂。Quartz 功能强大,可以结合 数据库持久化,进行 分布式任务延时调度

Cron表达式简介

Cron 表达式是一个字符串,字符串以 5 或 6 个 空格 隔开,分为 6 或 7 个 ,每一个域代表一个含义,Cron 有如下两种语法格式:

  • Seconds Minutes Hours DayofMonth Month DayofWeek Year
  • Seconds Minutes Hours DayofMonth Month DayofWeek

每个域对应的含义、域值范围和特殊表示符,从左到右依次如下:


Java 手写定时任务 java定时任务底层原理_java_02


如上面的表达式所示:

  • ""字符: 被用来指定所有的值。如:在分钟的字段域里表示"每分钟"。
  • "-"字符: 被用来指定一个范围。如:"10-12" 在小时域意味着 "10点、11点、12点"。