首页 > 代码库 > 使用Java写定时器

使用Java写定时器

    Java编写处理定时任务主要用到的类是java.util.Timer和java.util.TimerTask;

    

    如下几行代码就可以实现一个具有定时执行任务的定时器:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import MailSender.MailSender;//该类为我另外封装的发邮件的类

public class TimeTest {

	public static void main(String args[]) throws ParseException {
		
		Timer timer = new Timer();
		
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		  Date d1 = dateFormat.parse("2014/6/16 15:28:45");
		timer.schedule(new Task(),d1);
	}
}
	
class Task extends TimerTask{

	@Override
	public void run() {
		/*try {
			Runtime.getRuntime().exec("NotePad.exe");
		} catch (IOException e) {
			e.printStackTrace();
		}*/
		MailSender mailSender=new MailSender();
		boolean isSend = mailSender.SendMail();
		if(isSend){
			System.out.println("task has been excute!");
		}else{
			System.out.println("task has not been excute!");
		}
		System.out.println("定时线程已执行!");
	}
}


    其中,TimerTask实现了Runable接口,该类对象默认会执行run方法,所以可以将要定时执行的功能代码置于其中,即可实现定时功能;

    Timer类中的几个方法如下: 

  • public void schedule(TimerTask task,Date time);

    该方法安排在指定的时间执行指定的任务。如果此时间已过去,则安排立即执行该任务。

  • public void schedule(TimerTask task,long delay,long period);

    安排指定的任务从指定的延迟(long delay)后开始进行重复的固定延迟执行。以近似固定的时间间隔(long period)进行后续执行。

    在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。

    固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。 

  • public void schedule(TimerTask task,Date firstTime,long period);

    安排指定的任务在指定的时间(firstTime)开始进行重复的固定延迟执行。

  • public void scheduleAtFixedRate(TimerTask task,long delay,long period);

    安排指定的任务在指定的延迟(delay)后开始进行重复的固定速率执行。以近似固定的时间间隔(period)进行后续执行。

    在固定速率执行中,根据已安排的初始执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”。从长远来看,执行的频率将正好是指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。 固定速率执行适用于那些对绝对 时间敏感的重复执行活动,如每小时准点打钟报时,或者在每天的特定时间运行已安排的维护活动。

  • public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period);

    安排指定的任务在指定的时间开始进行重复的固定速率执行。

  • public void cancel();

    终止此计时器,丢弃所有当前已安排的任务。这不会干扰当前正在执行的任务(如果存在)。一旦终止了计时器,那么它的执行线程也会终止,并且无法根据它安排更多的任务。

    注意,在此计时器调用的计时器任务的 run 方法内调用此方法,就可以绝对确保正在执行的任务是此计时器所执行的最后一个任务。

    可以重复调用此方法;但是第二次和后续调用无效。

  • public int purge();

    从此计时器的任务队列中移除所有已取消的任务。调用此方法对计时器的行为没有影响,但是将无法引用队列中已取消的任务。如果没有对这些任务的外部引用,则它们就成为垃圾回收的合格对象。