更新時間:2020-05-19 16:11:14 來源:動力節點 瀏覽2754次
在JDK庫中Timer類的作用是是負責計劃任務的功能,也就是在指定的時間開始執行某一個任務。Timer類的方法列表如下圖所示,具體可以參照API說明。
Timer類的主要作用是設置計劃任務,但封裝任務的類卻是TimerTask類(計劃任務是調用timer.schedule()方法去執行的,需要執行的任務為第一個參數,也就是TimerTask類)。也就是說,執行計劃任務的代碼要放在TimerTask的子類中,因為TimerTask是一個抽象類(publicabstractclassTimerTaskimplementsRunnable)。下面看下schedule方法的介紹。
schedule(TimerTasktask,Datetime)
該方法的作用是在指定的日期執行一次某個任務,如果設置的時間比當前時間晚,那么到設置的時間再執行任務,如果設置的時間比當前時間早,那么立即執行。下面看下代碼示例。
在子類中實現了run方法,并在run方法中輸出當前運行時間的字符串形式。這里使用的是一個過時的方法Date.toLocalString()(已過時。從JDK1.1開始,由DateFormat.format(Datedate)取代),雖然過時了但是還能運行就是了,暫時拿來測試。下面看下測試類和結果。
這里的dateByStr是指執行任務的時間,將該時間作為第二個參數傳入schedule方法中,這里設置的時間是20:08,控制臺輸出的當前時間21:29,設置的時間是比當前時間早的,那么調用mt的時間就是馬上執行的,從運行結果也可以看到,mt也是馬上運行的。下面來看下比當前時間晚的時間的結果。
這里和上面的測試程序是一樣的,只是測試的時間換做是未來的時間,這里從結果可以看到,mt是在我們設置的時間運行的。
但是呢,這里有個問題就是,任務雖然執行完了,但是進行還沒有銷毀,呈紅色狀態(右下角程序還在運行)。
下面看下創建Timer對象的源碼。調用的是無參的構造函數
publicTimer(){
this("Timer-"+serialNumber());
}
從這邊可以看到調用的是Timer(Stringname)方法(構造器中this()表示調用形式參數相同的同一個類中的另一個構造器),下面在看下Timer(Stringname)
publicTimer(Stringname){
thread.setName(name);
thread.start();
}
這里可以看到,其實每次創建Timer就是啟動一個新的線程,這個新啟動的線程不是守護線程(守護線程,是指在程序運行的時候在后臺提供一種通用服務的線程,比如垃圾回收線程就是一個很稱職的守護者,并且這種線程并不屬于程序中不可或缺的部分。因此,當所有的非守護線程結束時,程序也就終止了,同時會殺死進程中的所有守護線程。反過來說,只要任何非守護線程還在運行,程序就不會終止。),它一直在運行。
以上就是動力節點java培訓機構的小編針對“Java編程之timer多線程的使用”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習