更新時(shí)間:2020-05-19 16:11:14 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3136次
在JDK庫(kù)中Timer類(lèi)的作用是是負(fù)責(zé)計(jì)劃任務(wù)的功能,也就是在指定的時(shí)間開(kāi)始執(zhí)行某一個(gè)任務(wù)。Timer類(lèi)的方法列表如下圖所示,具體可以參照API說(shuō)明。

Timer類(lèi)的主要作用是設(shè)置計(jì)劃任務(wù),但封裝任務(wù)的類(lèi)卻是TimerTask類(lèi)(計(jì)劃任務(wù)是調(diào)用timer.schedule()方法去執(zhí)行的,需要執(zhí)行的任務(wù)為第一個(gè)參數(shù),也就是TimerTask類(lèi))。也就是說(shuō),執(zhí)行計(jì)劃任務(wù)的代碼要放在TimerTask的子類(lèi)中,因?yàn)門(mén)imerTask是一個(gè)抽象類(lèi)(publicabstractclassTimerTaskimplementsRunnable)。下面看下schedule方法的介紹。
schedule(TimerTasktask,Datetime)
該方法的作用是在指定的日期執(zhí)行一次某個(gè)任務(wù),如果設(shè)置的時(shí)間比當(dāng)前時(shí)間晚,那么到設(shè)置的時(shí)間再執(zhí)行任務(wù),如果設(shè)置的時(shí)間比當(dāng)前時(shí)間早,那么立即執(zhí)行。下面看下代碼示例。

在子類(lèi)中實(shí)現(xiàn)了run方法,并在run方法中輸出當(dāng)前運(yùn)行時(shí)間的字符串形式。這里使用的是一個(gè)過(guò)時(shí)的方法Date.toLocalString()(已過(guò)時(shí)。從JDK1.1開(kāi)始,由DateFormat.format(Datedate)取代),雖然過(guò)時(shí)了但是還能運(yùn)行就是了,暫時(shí)拿來(lái)測(cè)試。下面看下測(cè)試類(lèi)和結(jié)果。

這里的dateByStr是指執(zhí)行任務(wù)的時(shí)間,將該時(shí)間作為第二個(gè)參數(shù)傳入schedule方法中,這里設(shè)置的時(shí)間是20:08,控制臺(tái)輸出的當(dāng)前時(shí)間21:29,設(shè)置的時(shí)間是比當(dāng)前時(shí)間早的,那么調(diào)用mt的時(shí)間就是馬上執(zhí)行的,從運(yùn)行結(jié)果也可以看到,mt也是馬上運(yùn)行的。下面來(lái)看下比當(dāng)前時(shí)間晚的時(shí)間的結(jié)果。

這里和上面的測(cè)試程序是一樣的,只是測(cè)試的時(shí)間換做是未來(lái)的時(shí)間,這里從結(jié)果可以看到,mt是在我們?cè)O(shè)置的時(shí)間運(yùn)行的。
但是呢,這里有個(gè)問(wèn)題就是,任務(wù)雖然執(zhí)行完了,但是進(jìn)行還沒(méi)有銷(xiāo)毀,呈紅色狀態(tài)(右下角程序還在運(yùn)行)。
下面看下創(chuàng)建Timer對(duì)象的源碼。調(diào)用的是無(wú)參的構(gòu)造函數(shù)
publicTimer(){
this("Timer-"+serialNumber());
}
從這邊可以看到調(diào)用的是Timer(Stringname)方法(構(gòu)造器中this()表示調(diào)用形式參數(shù)相同的同一個(gè)類(lèi)中的另一個(gè)構(gòu)造器),下面在看下Timer(Stringname)
publicTimer(Stringname){
thread.setName(name);
thread.start();
}
這里可以看到,其實(shí)每次創(chuàng)建Timer就是啟動(dòng)一個(gè)新的線程,這個(gè)新啟動(dòng)的線程不是守護(hù)線程(守護(hù)線程,是指在程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線程,比如垃圾回收線程就是一個(gè)很稱(chēng)職的守護(hù)者,并且這種線程并不屬于程序中不可或缺的部分。因此,當(dāng)所有的非守護(hù)線程結(jié)束時(shí),程序也就終止了,同時(shí)會(huì)殺死進(jìn)程中的所有守護(hù)線程。反過(guò)來(lái)說(shuō),只要任何非守護(hù)線程還在運(yùn)行,程序就不會(huì)終止。),它一直在運(yùn)行。

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java編程之timer多線程的使用”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)