学习目标
了解定时调度的作用
掌握Timer和TimerTask类的作用
定时调度:每到一定时间,程序会自动执行,称为定时调度
如果要使用定时调度,则必须保证程序始终运行着才可以,也就是说相当于定时调度是在程序之外又启动了一个新的线程。
Timer和TimerTask两个类完成定时调度
Timer类
Timer类是一种线程设施,可以用来实现在某一时间或某一段时间后,安排某一任务执行一次,或定期重复执行。该功能要与TimerTask配合使用。TimerTask类是用来实现由Timer安排的一次或重复执行的某一个任务。
每一个Timer对象对应的是一个线程,因此计时器所执行的任务应该迅速完成,否则可能会延迟后续任务的执行,而这些后续任务就有可能堆积在一起,等到该任务完成后才能快速连续执行。
Timer类中的常用方法
1、public Timer() 用来创建一个计时器并启动该计时器。
2、public void cancel() 用来中止该计时器,并放弃所有已安排的任务,对当前正在执行的任务没有影响。
3、public int purge() 将所有已取消的任务移除,一般用来释放内存空间。
4、public void schedule(TimeTask task,Date time) 安排一个任务在指定的时间执行,,如果已经超过了该时间则立即执行。
5、public void schedule(TimeTask task, Date firstTime,long period) 安排一个任务在指定的时间执行,之后以固定的频率(单位:毫秒)重复执行
6、public void schedule(TimerTask task, long delay) 安排一个任务在一段时间(单位:毫秒)后执行。
7、public void schedule(TimerTask task, long delay, long period) 安排一个任务在一段时间(单位:毫秒)后执行,之后以固定频率(单位:毫秒)重复执行。
8、public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 安排一个任务在指定的时间执行,之后以近似固定的频率(单位:毫秒)重复执行。
9、public void scheduleAtFixedRate(TimerTask task,long delay, long period) 安排一个任务在一段时间(单位:毫秒)后执行,之后以近似固定的频率(单位:毫秒)重复执行。
schedule()与scheduleAtFixedRate()方法的区别:
两者的区别在于重复执行任务时,对于时间间隔出现延迟的情况处理:
schedule()方法的执行时间间隔永远是固定的,如果之前出现了延迟的情况,之后也会继续按照设定好的时间间隔来执行。下一次的执行时间点 = 上一次程序执行完成的时间点 + 间隔时间;
scheduleAtFixedRate()方法可以根据出现的延迟时间自动调整下一次下一次的间隔时间。
下一次的执行时间点 = 上一次程序开始执行的时间点 + 间隔时间;并且前一个任务要执行6秒,而当前的任务已经开始执行了,因此两个任务间存在重叠,需要考虑线程同步问题。
TimerTask类
要想执行具体的任务,则必须使用TimerTask类。TimerTask类是一个抽象类,如果要使用该类,需要自己建立一个类来继承此类,并实现其中的抽象方法。
1、public void cancel() 用来终止此任务,如果该任务只执行一次且还未执行,则永远不会再执行(如果任务正在执行,则执行完后不会再执行)
2、public void run() 该任务所要执行的具体操作,该方法为引入的接口Runnable中的方法,子类需要覆写此方法。
3、public long scheduledExecutionTime() 返回近一次要执行该任务的时间(如果正在执行,如果正在执行,则返回此任务的执行安排时间),一般在run()方法中调用,用来判断当前是否有足够的时间开执行完成该任务。
如果现在一个Timer类要想调度程序的话,则需要使用TimerTask的子类。
就依照此概念,完成一个定时调度程序,没隔2秒打印一次时间。
// 完成具体的任务操作
import java.util.TimerTask ;
import java.util.Date ;
import java.text.SimpleDateFormat ;
class MyTask extends TimerTask{ // 任务调度类都要继承TimerTask
public void run(){
SimpleDateFormat sdf = null ;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;
System.out.println("当前系统时间为:" + sdf.format(new Date())) ;
}
};
完成的是一个具体的任务操作类,以后定时调度就调度的是此类的操作,方法的主体就是run()方法建立测试类并执行任务调度。
import java.util.Timer ;
public class TestTask{
public static void main(String args[]){
Timer t = new Timer() ; // 建立Timer类对象
MyTask mytask = new MyTask() ; // 定义任务
t.schedule(mytask,1000,2000) ; // 设置任务的执行,1秒后开始,每2秒重复
}
};
总结:
一般在web的开发中此内容比较有用,因为要维护一个容器不关闭才可以一直定时操作下去。