定时任务调度:基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行任务。
- Timer由JDK自带,不需要引入多余的jar。
- Quartz需要引入架包,Quartz时间控制更强大,Timer只有一个后台线程执行任务,Quartz拥有后台执行线程池能够使用多个线程执行任务。
- 能用 Timer 处理的时候,尽量用 Timer 处理。因为 Quartz 需要的资源更多(写法也不一样)。
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的区别:
区别一:
Ps1:schedule:时间回到过去,但是开始执行时以一次到达正常时间,然后间隔时间输出。
Ps2:scheduleAtFixedRate:同样时间回到过去,但是开始执行多次到达正常时间,然后间隔时间输出。
区别二:
Ps1:schedule:下次开始执行的时间以上次run方法完成时间为基准。
Ps2:scheduleAtFixedRate:下次开始执行的时间以上次run方法开始时间为基准。
Timer 缺陷:
- 管理并发任务的缺陷
每次有且仅有一个线程去执行定时任务,如存在多任务会导致任务时间过长(串行) - 当任务抛出异常时的缺陷
当抛出RuntimeException(如果不捕捉异常),会停止所有任务 - 在以下情况禁止使用
对时效性要求较高的多任务并发作业,或者一些复杂的任务作业。