日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Timer

發(fā)布時(shí)間:2025/3/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Timer 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在應(yīng)用開發(fā)中,經(jīng)常需要一些周期性的操作,比如每5分鐘檢查一下新郵件等。對(duì)于這樣的操作最方便、高效的實(shí)現(xiàn)方式就是使用java.util.Timer工具類。比如下面的代碼每5分鐘檢查一遍是否有新郵件:
????????private?java.util.Timer?timer;
????????timer?=?new?Timer(true);
????????timer.schedule(new?java.util.TimerTask()?{
????????????public?void?run()?{
????????????????????//server.checkNewMail();?檢查新郵件
????????????}
????????},?0,?5*60*1000);

使用這幾行代碼之后,Timer本身會(huì)每隔5分鐘調(diào)用一遍server.checkNewMail()方法,不需要自己啟動(dòng)線程。Timer本身也是多線程同步的,多個(gè)線程可以共用一個(gè)Timer,不需要外部的同步代碼。
????在《The?Java?Tutorial》中有更完整的例子:
public?class?AnnoyingBeep?{
????Toolkit?toolkit;
????Timer?timer;

????public?AnnoyingBeep()?{
????toolkit?=?Toolkit.getDefaultToolkit();
????????timer?=?new?Timer();
????????timer.schedule(new?RemindTask(),
???????????????????0,????????//initial?delay
???????????????????1*1000);??//subsequent?rate
????}

????class?RemindTask?extends?TimerTask?{
????int?numWarningBeeps?=?3;

????????public?void?run()?{
????????if?(numWarningBeeps?>?0)?{
????????????toolkit.beep();
????????System.out.println("Beep!");
????????numWarningBeeps--;
????????}?else?{
????????????toolkit.beep();?
????????????????System.out.println("Time's?up!");
????????????//timer.cancel();?//Not?necessary?because?we?call?System.exit
????????????System.exit(0);???//Stops?the?AWT?thread?(and?everything?else)
????????}
????????}
????}
????...
}
這段程序,每隔3秒響鈴一聲,并打印出一行消息。循環(huán)3次。程序輸出如下:
Task?scheduled.
Beep!??????
Beep!??????//one?second?after?the?first?beep
Beep!??????//one?second?after?the?second?beep
Time's?up!?//one?second?after?the?third?beep

Timer類也可以方便地用來作為延遲執(zhí)行,比如下面的代碼延遲指定的時(shí)間(以秒為單位)執(zhí)行某操作。類似電視的延遲關(guān)機(jī)功能。
...
public?class?ReminderBeep?{
????...
????public?ReminderBeep(int?seconds)?{
????toolkit?=?Toolkit.getDefaultToolkit();
????????timer?=?new?Timer();
????????timer.schedule(new?RemindTask(),?seconds*1000);
????}

????class?RemindTask?extends?TimerTask?{
????????public?void?run()?{
????????????System.out.println("Time's?up!");
????????toolkit.beep();
????????//timer.cancel();?//Not?necessary?because?we?call?System.exit
????????System.exit(0);???//Stops?the?AWT?thread?(and?everything?else)
????????}
????}
????...
}


1.?有朋友來信問,希望自己的Task一直運(yùn)行,而不是像上面的RemindTask那樣僅循環(huán)3次。
這很簡單,可能這位朋友把Task的作用理解有誤,Task僅代表了一次的動(dòng)作。而不是讓Task完成循環(huán)。上面的RemindTask中之所以有一個(gè)計(jì)數(shù),是因?yàn)橐\(yùn)行3次停止,如果需要一直保持運(yùn)行。把上面有關(guān)的計(jì)數(shù)的代碼全部去除即可。其實(shí)Timer中并沒有提供運(yùn)行指定次數(shù)后即停止的機(jī)制,所以,上面的計(jì)數(shù)滿足了這個(gè)功能需要。

2.?能否設(shè)置Timer的優(yōu)先級(jí)?
Timer中是利用一個(gè)線程來進(jìn)行計(jì)時(shí)及周期觸發(fā)動(dòng)作的。現(xiàn)在的Timer實(shí)現(xiàn)中并沒有提供設(shè)置優(yōu)先級(jí)的方法,在你調(diào)用new?Timer()時(shí)線程已經(jīng)啟動(dòng),所以,除非Timer的以后版本中在構(gòu)造方法中增加優(yōu)先級(jí)參數(shù),否則,我們是不能控制其優(yōu)先級(jí)的。現(xiàn)在的Timer默認(rèn)是在Thread.NORM_PRIORITY優(yōu)先級(jí)下運(yùn)行的。但是Timer提供了一個(gè)Timer(boolean?isDaemon)的構(gòu)造方法,可以將Timer設(shè)置為daemon線程。這樣,在你的程序中其它線程都運(yùn)行完畢后,程序就可以退出了。

3.?Timer是不是實(shí)現(xiàn)了精確地定時(shí)?
否。Timer中也是采用Object.wait(long?time)來實(shí)現(xiàn)定時(shí)的,由于Object.wait()不保證精確計(jì)時(shí),所以Timer也不是一個(gè)精確的時(shí)鐘。如果是實(shí)時(shí)系統(tǒng),不能依賴Timer。

4.?(liangyiqing)假如我在一個(gè)Timer類里面再定義一個(gè)Timer類,如果外層定義的時(shí)間是24小時(shí)循環(huán)一次,而內(nèi)層定義的是1小時(shí)循環(huán)一次,意思就是當(dāng)一個(gè)小時(shí)內(nèi)層運(yùn)行完一次之后,內(nèi)層Timer釋放資源,我想問,外層的Timer是不是也會(huì)釋放,還是24小時(shí)之中一直都在占用?
我不太清楚你的占用資源是什么意思,如果你在Task中用到一些資源,這些資源應(yīng)該在Task運(yùn)行結(jié)束后即刻釋放,尤其對(duì)競態(tài)條件,更應(yīng)該占用盡量少的時(shí)間。一般來說,一次Task的運(yùn)行時(shí)間,將少于你設(shè)定的周期。否則,Task將在Timer中堆積起來。如果你要實(shí)現(xiàn)上面說的每24小時(shí)和每1小時(shí)兩個(gè)周期的操作,可以使用一個(gè)Timer,schedule兩個(gè)Task即可。

5.?Timer是否可以在多線程環(huán)境下使用?
可以。Timer中用于存儲(chǔ)Task的容器是同步了的,保證了多線程環(huán)境先的安全使用。

6.?(austin1979?)請(qǐng)問,定時(shí)的時(shí)間能為變量,可以在程序中變化嗎?就是說定時(shí)的時(shí)間可以又界面來控制。
一個(gè)Timer可以控制任意多個(gè)Task的不同周期設(shè)定的觸發(fā)。也就是說,這個(gè)Timer類似于可以定多個(gè)時(shí)間的鬧鐘,比如我的手機(jī)就有3個(gè)鬧鐘?:)??。但是一旦一個(gè)Task?已經(jīng)進(jìn)行了schedule了,那么就不能再次進(jìn)行設(shè)定。所以,也不可能再改變其周期、延遲等等設(shè)定了。可以看下面的代碼:
????????????synchronized(task.lock)?{
????????????????if?(task.state?!=?TimerTask.VIRGIN)
????????????????????throw?new?IllegalStateException(
????????????????????????"Task?already?scheduled?or?cancelled");
????????????????task.nextExecutionTime?=?time;
????????????????task.period?=?period;
????????????????task.state?=?TimerTask.SCHEDULED;
????????????}

7.?(eqingtian)可不可以認(rèn)為Timer就是一個(gè)線程的發(fā)射器?

?

Timer中僅有一個(gè)存儲(chǔ)Task的Queue和一個(gè)調(diào)度所有Task的線程。不管你schedule幾次,在Timer上加了幾個(gè)Task,都只有一個(gè)后臺(tái)的線程進(jìn)行調(diào)度。

?

?

?

2014-11-12

總結(jié)

以上是生活随笔為你收集整理的Timer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。