Java的定时调度

时间:2022-01-18 09:11:54

  一般在web开发中定时调度比较有用,因为要维护一个容器不关闭才可以一直定时操作下去。

  定时调度:每当一段时间之后,程序就会自动执行,就称为定时调度。如果要使用定时调动,则必须要保证程序要始终运行着,也就是说定时调度是在程序之外又启动了一个新的线程。

  完成定时调度需要TimerTimerTask类的支持

Timer类:

  • l Timer类是一种线程设施,可以是现在某一时间或某一时间后,安排某一任务执行一次,或定期重复执行。给功能要与TimerTask类结合使用。TimerTask类用来实现由Timer类安排的一次或重复执行的某一任务。
  • 每一个Timer对象对应的是一个线程,因此计时器所执行的任务应该迅速完成,否则会延迟后续任务的执行,而这些后续的任务可能堆在一起,等到该任务完成后快速迅速执行。

   Java的定时调度

schedule()scheduleAtFixedRate()方法的区别:

两者区别在于重复执行任务时,对于时间间隔出现延迟的情况的处理:

  • l schedule()方法的执行时间间隔是固定的,如果之前出现了延迟的情况,之后也会继续按照指定的时间间隔来执行;
  • l scheduleAtFixedRate()方法可以根据出现的延迟时间自动调整下一次间隔的执行时间。

TimerTask类:

  要想执行具体的任务,则必须使用TimerTask类。TimerTask类是一个抽象类,如果要使用此类,需要自己建立一个类继承此类,并实现其中的抽象方法。

   Java的定时调度

按照此概念,完成一个时间调度程序,每隔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 }