Timer的介绍

发表时间:2017-09-07 22:30:52 浏览量( 20 ) 留言数( 0 )

学习目标:

1、了解Timer的实现

2、可以对Timer的源代码进行了解


学习过程:

    Timer是用于管理在后台执行的延迟任务或周期性任务,其中的任务使用java.util.TimerTask表示。任务的执行方式有两种:

    按固定速率执行:即scheduleAtFixedRate的两个重载方法

    按固定延迟执行:即schedule的4个重载方法

    具体差别会在后面详细说明。

    我们要实现一个定时任务,只需要实现TimerTask的run方法即可。每一个任务都有下一次执行时间nextExecutionTime(毫秒),如果是周期性的任务,那么每次执行都会更新这个时间为下一次的执行时间,当nextExecutionTime小于当前时间时,都会执行它。

    对于每一个Timer,后台只使用一个线程来执行所有的任务。而所有的任务都保存到一个任务队列java.util.TaskQueue中,它是Timer的一个内部类,这是一个优先级队列

由于Timer存在上面说的这些缺陷,在JDK1.5中,我们可以使用ScheduledThreadPoolExecutor来代替它,使用Executors.newScheduledThreadPool工厂方法或使用               ScheduledThreadPoolExecutor的构造函数来创建定时任务,它是基于线程池的实现,不会存在Timer存在的上述问题,当线程数量为1时,它相当于Timer。


二、代码

(1)延迟执行

public class Run1 {

	public static void main(String[] args) {
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("Timer is running");
			}
		}, 2000);
	}

}

(2)固定速率

public class Run2 {

	// 表示2秒后开始执行,然后每隔5秒执行一次。
	public static void main(String[] args) {
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("Timer is running"+new Date());
			}
		}, 2000, 1000);
	}

}