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