Timer - 基础篇

Timer - 基础篇

定时任务调度:基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行任务。

Timer - 基础篇

  • Timer由JDK自带,不需要引入多余的jar。
  • Quartz需要引入架包,Quartz时间控制更强大,Timer只有一个后台线程执行任务,Quartz拥有后台执行线程池能够使用多个线程执行任务。
  • 能用 Timer 处理的时候,尽量用 Timer 处理。因为 Quartz 需要的资源更多(写法也不一样)。

Timer - 基础篇

Timer - 基础篇

Timer - 基础篇

schedule的四种用法:

用法一:
API:schedule(task, time)
参数:task - 表示所要安排的任务,time - 表示执行任务的时间。
作用:在时间等于或超过time的时候执行且仅执行一次task。

 

用法二:
API:schedule(task, time, period)
参数:task - 所要安排的任务,
time - 首次执行任务的时间,period - 执行一次task的时间间隔,单位是毫秒。
作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。

 

用法三:
API:schedule(task, delay)
参数:task - 所要安排的任务,delay - 执行任务前的延迟时间,单位是毫秒。
作用:等待delay毫秒后执行且仅执行一次task。

 

用法四:
API:schedule(task, delay, period)
参数:task - 所要安排的任务,
delay - 执行任务前的延迟时间,单位是毫秒,period - 执行一次task的时间间隔,单位是毫秒。
作用:等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task。

注意:delay属于long类型,time属于Date类型。

 

scheduleAtFixedRate的两种用法:

用法一:
API:scheduleAtFixedRate(task, time, period)
参数:task - 所要安排的任务
,time - 首次执行任务的时间,period - 执行一次task的时间间隔,单位是毫秒。
作用:时间等于或超过time时首次执行task
,之后每隔period毫秒重复执行一次task。

用法二:
API:scheduleAtFixedRate(task, delay, period)
参数:task - 所要安排的任务,
delay - 执行任务前的延迟时间,单位是毫秒,period - 执行一次task的时间间隔,单位是毫秒。
作用:等待delay毫秒后首次执行task,
之后每隔period毫秒重复执行一次task。

 

其他重要函数:

1、TimerTask的cancel(),scheduledExecutionTime()

cancel():
作用:取消当前TimerTask里的任务。

scheduledExecutionTime():
作用:返回此任务最近实际执行的已安排执行的时间。
返回值:最近发生此任务执行安排的时间,为long型。

 

2、Timer的cancel(),purge()
cancel():
作用:终止计时器,丢弃所有已安排的任务。

purge():
作用:从此计时器的任务队列中移除所有已取消的任务。
返回值:为从队列中移除的任务数。

 

schedule和scheduleAtFixedRate的区别:

区别一:

Timer - 基础篇Timer - 基础篇

Ps1:schedule:时间回到过去,但是开始执行时以一次到达正常时间,然后间隔时间输出。

Ps2:scheduleAtFixedRate:同样时间回到过去,但是开始执行多次到达正常时间,然后间隔时间输出。

区别二:

Timer - 基础篇 Timer - 基础篇

Ps1:schedule:下次开始执行的时间以上次run方法完成时间为基准。

Ps2scheduleAtFixedRate:下次开始执行的时间以上次run方法开始时间为基准。

 

Timer 缺陷:

  1. 管理并发任务的缺陷
    每次有且仅有一个线程去执行定时任务,如存在多任务会导致任务时间过长(串行)
  2. 当任务抛出异常时的缺陷
    当抛出RuntimeException(如果不捕捉异常),会停止所有任务
  3. 在以下情况禁止使用
    对时效性要求较高的多任务并发作业,或者一些复杂的任务作业。