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.。所以,鬧鐘的原理,大致就是這麼實現的。