Timer类小记

java.util.Timer 是 JDK 提供的一种计时器,用于使后台线程按计划执行指定任务,这些任务可以被执行一次,也可以被定期执行。每个 Timer 对象对应一个后台线程,顺序地执行所有计时器任务。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程,从而可能延迟后续任务的执行。对 Timer 对象最后的引用完成并且所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。以下为一个使用 java.util.Timer 的例子:

public class TimeTest {
 
	public static void main(String[] args) {
		Timer timer = new Timer();
		//timer.scheduleAtFixedRate(new MyTask(), 1000, 2000);// /在1秒后执行此任务,每次间隔2秒
		timer.schedule(new MyTask(), 1000, 2000);
 
		while (true) {
			try {
				int ch = System.in.read();
				if (ch - 'c' == 0) {
					timer.cancel();
 
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
 
	static class MyTask extends java.util.TimerTask {
		@Override
		public void run() {
			System.out.println("________");
		}
	}
 
}

如果你使用的是JDK 5+,还有一个scheduleAtFixedRate模式可以用,在这个模式下,Timer会尽量的让任务在一个固定的频率下运行,举例说明:在上面的例子中,我们想让MyTask在1秒钟后,每两秒钟执行一次,但是因为java不是实时的(其实java实时性很差…..),所以,我们在上个程序中表达的原义并不能够严格执行.如果我们调用的是scheduleAtFixedRate,那么,Timer会尽量让你的Task执行的频率保持在2秒一次.运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,MyTask 执行一次,因为系统繁忙,之后的2.5秒后MyTask 才得以执行第二次,然后,Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么,1.5秒后,MyTask 将执行的三次.”以固定的频率而不是固定的延迟时间去执行一个任务”

Leave a Comment.