多線程之Timer類的使用(一)

新創建集團 技術 西城舊夢夢舊人 2017-06-06

在JDK庫中Timer類的作用是是負責計劃任務的功能,也就是在指定的時間開始執行某一個任務。Timer類的方法列表如下圖所示,具體可以參照API說明。

多線程之Timer類的使用(一)

Timer類的方法列表

Timer類的主要作用是設置計劃任務,但封裝任務的類卻是TimerTask類(計劃任務是調用timer.schedule()方法去執行的,需要執行的任務為第一個參數,也就是TimerTask類)。也就是說,執行計劃任務的代碼要放在TimerTask的子類中,因為TimerTask是一個抽象類(public abstract class TimerTask implements Runnable)。下面看下schedule方法的介紹。

  • schedule(TimerTask task, Date time)

該方法的作用是在指定的日期執行一次某個任務,如果設置的時間比當前時間晚,那麼到設置的時間再執行任務,如果設置的時間比當前時間早,那麼立即執行。下面看下代碼示例。

多線程之Timer類的使用(一)

TimerTask子類

在子類中實現了run方法,並在run方法中輸出當前運行時間的字符串形式。這裡使用的是一個過時的方法Date.toLocalString()(已過時。 從 JDK 1.1 開始,由DateFormat.format(Date date)取代),雖然過時了但是還能運行就是了,暫時拿來測試。下面看下測試類和結果。

多線程之Timer類的使用(一)

測試類(時間比當前早)

這裡的dateByStr是指執行任務的時間,將該時間作為第二個參數傳入schedule方法中,這裡設置的時間是20:08,控制檯輸出的當前時間21:29,設置的時間是比當前時間早的,那麼調用mt的時間就是馬上執行的,從運行結果也可以看到,mt也是馬上運行的。下面來看下比當前時間晚的時間的結果。

多線程之Timer類的使用(一)

測試類(比當前晚)

這裡和上面的測試程序是一樣的,只是測試的時間換做是未來的時間,這裡從結果可以看到,mt是在我們設置的時間運行的。

但是呢,這裡有個問題就是,任務雖然執行完了,但是進行還沒有銷燬,呈紅色狀態(右下角程序還在運行)。

下面看下創建Timer對象的源碼。調用的是無參的構造函數

public Timer() {

this("Timer-" + serialNumber());

}

從這邊可以看到調用的是Timer(String name)方法(構造器中this()表示調用形式參數相同的同一個類中的另一個構造器),下面在看下Timer(String name)

public Timer(String name) {

thread.setName(name);

thread.start();

}

這裡可以看到,其實每次創建Timer就是啟動一個新的線程,這個新啟動的線程不是守護線程(守護 線程,是指在程序運行的時候在後臺提供一種通用服務的線程,比如垃圾回收線程就是一個很稱職的守護者,並且這種線程並不屬於程序中不可或缺的部分。因此,當所有的非守護線程結束時,程序也就終止了,同時會殺死進程中的所有守護線程。反過來說,只要任何非守護線程還在運行,程序就不會終止。),它一直在運行。

那麼,怎麼修改新創建的Timer是守護線程呢?

請聽明天內容嘿嘿~~

喜歡的關注一波~~