Java定时任务调度工具详解之Timer

来源:互联网 发布:遗传算法c语言程序 编辑:程序博客网 时间:2024/06/06 04:09

一、基本概念

1、什么是定时任务调度

基于给定的时间点给定的时间间隔或者给定的执行次数自动执行的任务

2、在Java中的定时调度工具

(1)两种工具

Timer

Quartz

(2)两者的区别:

1>出身不同:Timer由jdk直接提供,调用方式简单粗暴,不需要别的jar包支持

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,并非jdk提供,需要引入别的jar包

2>能力区别:某个时间执行什么任务的话,Timer就可以搞定,而如果要每个星期的9点提示约会的话就需要Quartz,由此得出,Quartz的时间控制功能远比Timer强大

3>底层机制:Timer只有一个后台线程去执行定时任务,而拥有后台执行线程池的Quartz能够使用多个线程去执行定时任务

Timer小弟能进行实现的尽量用Timer,因为Quartz大哥出场费更高

二、Timer纸上谈兵及第一个例子

1、Timer定义

有且只有一个后台线程多个业务线程进行定时定频率的调度

2、主要的构件


3、Timer工具类详解

4、第一个实例

MyTimerTask.java
public class MyTimerTask extends TimerTask{private String name;public MyTimerTask(String name) {super();this.name = name;}@Overridepublic void run() {//打印当前name的内容System.out.println("Current exec name:"+name);}public String getName() {return name;}public void setName(String name) {this.name = name;}}

MyTimer.java
public class MyTimer {public static void main(String[] args) {//1.创建一个Timer实例Timer timer = new Timer();//2.创建一个MyTimerTask实例MyTimerTask myTimerTask = new MyTimerTask("徐志摩");//3.通过timer定时定频率调用MyTimerTask的业务逻辑//第一次执行是在当前的2秒之后,之后每隔一秒执行一次timer.schedule(myTimerTask,2000L,1000L);}}

三、Timer函数及综合应用

1、schedule的四种用法

(1)schedule(task,time)

参数:task-所要安排的任务 time-执行任务的时间
作用:在时间等于或超过time的时候执行且仅执行一次task

(2)schedule(task,time,period)

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

(3)schedule(task,delay)

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

(4)schedule(task,delay,period)

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

2、scheduleAtFixedRate的两种用法

(1)scheduleAtFixedRate(task,time,period)

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

(2)scheduleAtFixedRate(task , delay,period)

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

3、其他重要函数

(1)TimerTask的cancel(),scheduledExecutionTime()

1>cancel()
作用:取消当前TimeTask里的任务
2>scheduledExecutionTime()
作用:返回此任务最近执行的已安排执行的时间
返回值:最近发生执行安排的时间,为long型

(2)Timer的cancel(),purge()

1>cancel()
作用:终止此定时器,丢弃所有当前已安排的任务
2>purge()
作用:从此计时器的任务队列中移除所有已取消的任务
返回值:从队列中移除的任务数

4、schedule和scheduleAtFixedRate的区别

两种情况看区别:
(1)首次计划执行的时间早于当前的时间
schedule()方法
“fixed-delay”;如果第一次执行的时间被delay了,随后的执行时间按照上一次实际执行完成时间点进行计算
2>scheduleAtFixedRate方法
“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照上一次开始的时间点进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行需要考虑同步
(2)任务执行时间超出周期间隔
1>schedule方法
下一次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后
2>scheduleAtFixedRate方法
下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性

四、Timer的缺陷

1、管理并发任务的缺陷

Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符

2、当任务抛出异常时的缺陷

如果TimerTask抛出RuntimeExcetion,Timer会停止所有任务的运行

3、Timer使用的禁区

(1)对时效要求较高的多任务并发作业
(2)对复杂的任务的调度