在JDK庫中Timer類的作用是是負(fù)責(zé)計(jì)劃任務(wù)的功能,也就是在指定的時(shí)間開始執(zhí)行某一個(gè)任務(wù)。Timer類的方法列表如下圖所示,具體可以參照API說明。
Timer類的主要作用是設(shè)置計(jì)劃任務(wù),但封裝任務(wù)的類卻是TimerTask類(計(jì)劃任務(wù)是調(diào)用timer.schedule()方法去執(zhí)行的,需要執(zhí)行的任務(wù)為第一個(gè)參數(shù),也就是TimerTask類)。也就是說,執(zhí)行計(jì)劃任務(wù)的代碼要放在TimerTask的子類中,因?yàn)門imerTask是一個(gè)抽象類(publicabstractclassTimerTaskimplementsRunnable)。下面看下schedule方法的介紹。
schedule(TimerTasktask,Datetime)
該方法的作用是在指定的日期執(zhí)行一次某個(gè)任務(wù),如果設(shè)置的時(shí)間比當(dāng)前時(shí)間晚,那么到設(shè)置的時(shí)間再執(zhí)行任務(wù),如果設(shè)置的時(shí)間比當(dāng)前時(shí)間早,那么立即執(zhí)行。下面看下代碼示例。
在子類中實(shí)現(xiàn)了run方法,并在run方法中輸出當(dāng)前運(yùn)行時(shí)間的字符串形式。這里使用的是一個(gè)過時(shí)的方法Date.toLocalString()(已過時(shí)。從JDK1.1開始,由DateFormat.format(Datedate)取代),雖然過時(shí)了但是還能運(yùn)行就是了,暫時(shí)拿來測試。下面看下測試類和結(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)行的。下面來看下比當(dāng)前時(shí)間晚的時(shí)間的結(jié)果。
這里和上面的測試程序是一樣的,只是測試的時(shí)間換做是未來的時(shí)間,這里從結(jié)果可以看到,mt是在我們?cè)O(shè)置的時(shí)間運(yùn)行的。
但是呢,這里有個(gè)問題就是,任務(wù)雖然執(zhí)行完了,但是進(jìn)行還沒有銷毀,呈紅色狀態(tài)(右下角程序還在運(yùn)行)。
下面看下創(chuàng)建Timer對(duì)象的源碼。調(diào)用的是無參的構(gòu)造函數(shù)
publicTimer(){this("Timer-"+serialNumber());}
從這邊可以看到調(diào)用的是Timer(Stringname)方法(構(gòu)造器中this()表示調(diào)用形式參數(shù)相同的同一個(gè)類中的另一個(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è)很稱職的守護(hù)者,并且這種線程并不屬于程序中不可或缺的部分。因此,當(dāng)所有的非守護(hù)線程結(jié)束時(shí),程序也就終止了,同時(shí)會(huì)殺死進(jìn)程中的所有守護(hù)線程。反過來說,只要任何非守護(hù)線程還在運(yùn)行,程序就不會(huì)終止。),它一直在運(yùn)行。
以上就是北大青鳥長沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java編程之timer多線程的使用”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。