前言
现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了。
很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清空你上月未用完流量,重置套餐流量,以及备忘录提醒、闹钟等功能。
Java 系统中主要有三种方式来实现定时任务:
Timer和TimerTask
ScheduledExecutorService
三方框架 Quartz
下面我们一个个来看。
1>Timer和TimerTask
先看一个小 demo,接着我们再来分析其中原理:
这种方式的定时任务主要用到两个类,Timer 和 TimerTask。其中,TimerTask 继承接口 Runnable,抽象的描述一种任务类型,我们只要重写实现它的 run 方法就可以实现自定义任务。
而 Timer 就是用于定时任务调度的核心类,demo 中我们调用其 schedule 并指定延时 1000 毫秒,所以上述代码会在一秒钟后完成打印操作,接着程序结束。
那么,使用上很简单,两个步骤即可,但是其中的实现逻辑是怎样的呢?
Timer 接口
首先,Timer 接口中,这两个字段是非常核心重要的:
TaskQueue 是一个队列,内部由动态数组实现的最小堆结构,