1. 程式人生 > >Java多執行緒-50-Timer類

Java多執行緒-50-Timer類

這篇來學習Timer類的基本使用,什麼是Timer類,檢視Java jdk API文件,可以看到第一句話:一種工具,執行緒用其安排以後在後臺執行緒中執行的任務。可安排任務執行一次,或者定期重複執行。這句話,就是我們本篇學習和練習的內容。生活中實際使用的例子有:手機鬧鐘,你可以設定鬧鐘一次,或者重複鬧鐘,例如上班期間週一到週五,早上六點半設定鬧鐘。如果是android手機,鬧鐘就用到了Timer類。等學習完本篇,你就知道android鬧鐘的工作原理。

1.檢視Timer類 API文件

開啟JDK 6 API文件,搜尋Timer,注意是 java.util.Timer ,這樣就看到了文章提到的這句話。

       這裡,我們來練習使用這兩個schedule方法。schedule方法的作用就是安排制定的時間執行指定的任務。我們就來模仿鬧鐘的設定來學習這兩個成員方法。

2. schedule(TimerTask task, Date time)

這個方法有兩個引數,TimerTask是一個類實現了Runnable介面,作用是由 Timer 安排為一次執行或重複執行的任務。舉例,鬧鐘響鈴就是這裡的TimerTask。第二個引數是一個時間,可以精確是年月日時分秒。下面,我們來寫一段程式碼,模仿鬧鐘在制定的時間鬧鈴。

package thread;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Timer_Demo {

	public static void main(String[] args) throws InterruptedException {
		myTimerTask mt = new myTimerTask();
		Timer t = new Timer();
		// set year: 2019-1900 = 119
		t.schedule(mt, new Date(119, 0, 5, 12, 43,40) );
		while(true) {
			Thread.sleep(1000);
			System.out.println(new Date());
		}

	}

}

class myTimerTask extends TimerTask {

	@Override
	public void run() {
		System.out.println("起床去上班了!");
	}
	
}

這裡我們定義一個自定義task類,繼承了TimerTask類。這裡我們當然寫不出呼叫音效卡驅動程式去響鈴,所以,這裡我們就寫一個列印語句,顯示起床去上班。在new Date()這裡強調下,年份和月份的寫法。年份=今年2019-1900=119,月份範圍是0到11.執行結果是。

Sat Jan 05 12:43:32 CST 2019
Sat Jan 05 12:43:33 CST 2019
Sat Jan 05 12:43:34 CST 2019
Sat Jan 05 12:43:35 CST 2019
Sat Jan 05 12:43:36 CST 2019
Sat Jan 05 12:43:37 CST 2019
Sat Jan 05 12:43:38 CST 2019
Sat Jan 05 12:43:39 CST 2019
起床去上班了!
Sat Jan 05 12:43:40 CST 2019
Sat Jan 05 12:43:41 CST 2019
Sat Jan 05 12:43:42 CST 2019

3.schedule(TimerTask task, Date time, long period)

添加了一個固定延遲的引數,上面這個例子我們是在特定時間點去列印起床去上班,那麼有時候鬧鐘鬧一次,你不去關閉,不理它。過幾分鐘有來響鈴,這個是怎麼實現的呢。看下面程式碼。

Sat Jan 05 13:52:43 CST 2019
Sat Jan 05 13:52:44 CST 2019
起床去上班了!
Sat Jan 05 13:52:45 CST 2019
Sat Jan 05 13:52:46 CST 2019
Sat Jan 05 13:52:47 CST 2019
起床去上班了!
Sat Jan 05 13:52:48 CST 2019
Sat Jan 05 13:52:49 CST 2019
Sat Jan 05 13:52:50 CST 2019
起床去上班了!
Sat Jan 05 13:52:51 CST 2019
Sat Jan 05 13:52:52 CST 2019
Sat Jan 05 13:52:53 CST 2019
起床去上班了!
Sat Jan 05 13:52:54 CST 2019

上面設定了三秒的延遲,如果不主動關閉執行,每間隔三秒就鬧鈴一次。當然如果要模仿鬧鐘那樣,第一次延遲十分鐘,第二次延遲五分鐘,第三次更短。那麼這個也好做,定義一個retry變數,例如初始化間隔時間設定10分鐘,那麼我們上面程式碼間隔時間就可以這樣寫 (60000/2*retry), 使用者忽略不關閉鬧鐘一次,retry次數就加1.。所以,鬧鐘的原理,大致就是這麼實現的。