Java 中定时器 timer 的使用

package com.bugyun.timer;

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

public class TimerTest {
	private final static TimerTask timerTask = new MyTimerTask();

	public static void main(String[] args) {
//		timer1();
//		timer2();
//		timer3();
//		timer4();
	}

	// 第一种方法:设定指定任务task,在2秒后执行  
	public static void timer1() {
		Timer timer = new Timer();
		timer.schedule(timerTask, 2000);
	}

	// 第二种方法:设定指定任务task,在1秒后,每隔5秒执行一次
	public static void timer2() {
		Timer timer = new Timer();
		timer.schedule(timerTask, 1000, 5000);
	}

	// 第三种方法:设定指定任务task,在1秒后,第二天同一时间执行
	public static void timer3() {
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(timerTask, 1000, 1000 * 60 * 60 * 24);
	}

	// 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行.
	public static void timer4() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时
		calendar.set(Calendar.MINUTE, 0); // 控制分
		calendar.set(Calendar.SECOND, 0); // 控制秒

		Date date = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(timerTask, date, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
	}

}

class MyTimerTask extends TimerTask {

	@Override
	public void run() {
		System.out.println("当前执行时间是:"+now());
	}

	/**
	 * @description: 获得当前时间
	 * @return String   
	 * @throws
	 * @author beyond
	 * @data:2016年12月16日上午10:17:16
	 */
	public String now(){
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = new Date();
		String time = simpleDateFormat.format(date);
		return time;
	}
}

 

一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。

对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的 cancel 方法。

如果意外终止了计时器的任务执行线程,例如调用了它的 stop 方法,那么所有以后对该计时器安排任务的尝试都将导致 IllegalStateException,就好像调用了计时器的 cancel 方法一样。

此类是线程安全的:多个线程可以共享单个 Timer 对象而无需进行外部同步。

此类 提供实时保证:它使用 Object.wait(long) 方法来安排任务。

实现注意事项:此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部,它使用二进制堆来表示其任务队列,所以安排任务的开销是 O(log n),其中 n 是同时安排的任务数。

实现注意事项:所有构造方法都启动计时器线程。

 

schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次。

scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period。

猜你喜欢

转载自bugyun.iteye.com/blog/2345202