一般在web开发中定时调度比较有用,因为要维护一个容器不关闭才可以一直定时操作下去。
定时调度:每当一段时间之后,程序就会自动执行,就称为定时调度。如果要使用定时调动,则必须要保证程序要始终运行着,也就是说定时调度是在程序之外又启动了一个新的线程。
完成定时调度需要Timer和TimerTask类的支持
Timer类:
- l Timer类是一种线程设施,可以是现在某一时间或某一时间后,安排某一任务执行一次,或定期重复执行。给功能要与TimerTask类结合使用。TimerTask类用来实现由Timer类安排的一次或重复执行的某一任务。
- l 每一个Timer对象对应的是一个线程,因此计时器所执行的任务应该迅速完成,否则会延迟后续任务的执行,而这些后续的任务可能堆在一起,等到该任务完成后快速迅速执行。
schedule()和scheduleAtFixedRate()方法的区别:
两者区别在于重复执行任务时,对于时间间隔出现延迟的情况的处理:
- l schedule()方法的执行时间间隔是固定的,如果之前出现了延迟的情况,之后也会继续按照指定的时间间隔来执行;
- l scheduleAtFixedRate()方法可以根据出现的延迟时间自动调整下一次间隔的执行时间。
TimerTask类:
要想执行具体的任务,则必须使用TimerTask类。TimerTask类是一个抽象类,如果要使用此类,需要自己建立一个类继承此类,并实现其中的抽象方法。
按照此概念,完成一个时间调度程序,每隔2秒打印一次时间。
定义一个类基础TimerTask类,完成具体的任务。
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 import java.util.TimerTask; 4 5 public class MyTask extends TimerTask{ //任务调度类都要继承此类 6 @Override 7 public void run() { //完成具体的任务 8 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); 9 System.out.println("当前系统时间:"+sdf.format(new Date())); 10 } 11 }
完成的是一个具体的任务操作类,以后定调度调的就是此类中的run()方法。
1 public class TestTimerTask { //测试类 2 public static void main(String args[]){ 3 Timer t = new Timer(); //建立Timer对象 4 MyTask mt = new MyTask(); //定义任务 5 t.schedule(mt, 1000,2000); //设置任务的执行,1秒后开始,每2秒执行一次 6 } 7 }