【Java基礎】定時器Timer

簡介

JDK提供的定時器,能夠執行一些簡單不復雜的任務,若是須要功能強大的定時器Quartz框架。java

定時器任務的執行須要兩個基本的類:shell

    java.util.Timer安全

    java.util.TimerTask框架

要運行一個定時任務,最基本的步驟以下:ide

一、創建一個要執行的任務TimerTask。spa

二、建立一個Timer實例,經過Timer提供的schedule()方法,將TimerTask加入到定時器Timer中,同時設置執行的規則便可。線程

當程序執行了Timer初始化代碼後,Timer定時任務就會按照設置去執行。code

 

Timer中的schedule()方法是有多種重載格式的,以適應不一樣的狀況。該方法的格式以下:繼承

 void schedule(TimerTask task, Date time)隊列

          安排在指定的時間執行指定的任務。

 void schedule(TimerTask task, Date firstTime, long period)

          安排指定的任務在指定的時間開始進行重複的固定延遲執行。

 void schedule(TimerTask task, long delay)

          安排在指定延遲後執行指定的任務。

 void schedule(TimerTask task, long delay, long period)

          安排指定的任務從指定的延遲後開始進行重複的固定延遲執行。

 

Timer是線程安全的,此類可擴展到大量同時安排的任務(存在數千個都沒有問題)。其全部構造方法都啓動計時器線程。能夠調用cancel() 終止此計時器,丟棄全部當前已安排的任務。purge()今後計時器的任務隊列中移除全部已取消的任務。此類不提供實時保證:它使用 Object.wait(long) 方法來安排任務。

 

TimerTask是一個抽象類,由 Timer 安排爲一次執行或重複執行的任務。它有一個抽象方法run()----計時器任務要執行的操做。所以,每一個具體的任務類都必須繼承TimerTask類,而且重寫run()方法。另外它還有兩個非抽象的方法:

 boolean cancel()

          取消此計時器任務。

 long scheduledExecutionTime()

          返回此任務最近實際 執行的安排 執行時間。

例子

#1 簡單應用

    繼承TimerTask,建立執行任務

class TimeTask1 extends TimerTask {

	@Override
	public void run() {
		System.out.println(new Date());
		// 實現定時要作的事情
		System.out.println("爆炸!");
	}
}

    調度定時器

public class TimerTest1 {

	public static void main(String[] args) {
		// 建立一個TimerTask
		TimerTask task = new TimeTask1();
		Timer timer = new Timer();
		// 調度,10秒後執行
		// timer.schedule(task, 10000); // 10秒後爆炸(只執行一次)
		timer.schedule(task, 10000, 2000); // 這個是第一次10秒後爆炸,而後每隔2秒爆炸(循環執行)。
	}
}

    執行結果

Tue Dec 22 23:31:23 CST 2015
爆炸!
Tue Dec 22 23:31:25 CST 2015
爆炸!
Tue Dec 22 23:31:27 CST 2015
爆炸!
Tue Dec 22 23:31:29 CST 2015
爆炸!
Tue Dec 22 23:31:31 CST 2015
爆炸!
......

#2 定時任務循環調用

    建立定時執行任務

class TimeTask2 extends TimerTask {
	
	@Override
	public void run() {
		System.out.println(new Date());
		// 實現定時要作的事情
		System.out.println("爆炸!");
		new Timer().schedule(new TimeTask2(), 2000);
	}

}

    調動定時器

public class TimerTest2 {

	public static void main(String[] args) {
		// 建立一個TimerTask
		TimerTask task = new TimeTask2();
		Timer timer = new Timer();
		timer.schedule(task, 2000); // 啓動一個炸彈,而後該炸彈又啓動了一個炸彈,而後循環炸下去。
	}
}

    執行結果

Tue Dec 22 23:38:09 CST 2015
爆炸!
Tue Dec 22 23:38:11 CST 2015
爆炸!
Tue Dec 22 23:38:13 CST 2015
爆炸!
Tue Dec 22 23:38:15 CST 2015
爆炸!
......

#3 指定時間啓動定時器

    建立定時執行任務

class TimeTask3 extends TimerTask {

	@Override
	public void run() {
		System.out.println(new Date());
		// 實現定時要作的事情
		System.out.println("爆炸!");
	}
}

    調度定時器

public class TimerTest3 {

	public static void main(String[] args) {
		Calendar calendar=Calendar.getInstance();
		int year=calendar.get(Calendar.YEAR); //獲取當前的Year
		int month=calendar.get(Calendar.MONTH);//獲取當前的Month(0-11)
		int day=calendar.get(Calendar.DAY_OF_MONTH);//獲取當前的Day
		//calendar.set(year, month, day,23,46,15); 表示定時在天天下午23:46:15執行
		calendar.set(year, month, day,23,47,15);
		// 建立一個TimerTask
		TimerTask task = new TimeTask3();
		Timer timer = new Timer();
		// 調度
		timer.schedule(task,calendar.getTime());
	}
}

    執行結果

Tue Dec 22 23:47:15 CST 2015
爆炸!