青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

Java:如何正確使用Timer

在需要按時(shí)間計(jì)劃執(zhí)行簡單任務(wù)的情況下,Timer是最常被使用到的工具類。使用Timer來調(diào)度TimerTask的實(shí)現(xiàn)者來執(zhí)行任務(wù),有兩種方式,一種是使任務(wù)在指定時(shí)間被執(zhí)行一次,另一種是從某一指定時(shí)間開始周期性地執(zhí)行任務(wù)。
 
下面是一個(gè)簡單的Timer例子,它每隔10秒鐘執(zhí)行一次特定操作doWork。
Timer timer = new Timer();
                        TimerTask  task = new TimerTask (){
                        public void run() {
                             doWork();
                           }
};
              timer.schedule (task, 10000L, 10000L);
可以看到,具體的任務(wù)由TimerTask的子類實(shí)現(xiàn),Timer負(fù)責(zé)管理、執(zhí)行TimerTask。
 
Timer 的使用
在不同的場景下,需要使用不同的Timer接口。如上所說,主要區(qū)分兩種情況
1) 在指定時(shí)間執(zhí)行任務(wù),只執(zhí)行一次
-          public void schedule(TimerTask task, long delay)
-          public void schedule(TimerTask task, Date time)
 
2)從指定時(shí)間開始,周期性地重復(fù)執(zhí)行,直到任務(wù)被cancel掉。其中又分兩種類型:
2.1) 一種是按上一次任務(wù)執(zhí)行的時(shí)間為依據(jù),計(jì)算本次執(zhí)行時(shí)間,可以稱為相對(duì)時(shí)間法。比如,如果第一次任務(wù)是1分10秒執(zhí)行的,周期為5秒,因系統(tǒng)繁忙(比如垃 圾回收、虛擬內(nèi)存切換),1分15秒沒有得到機(jī)會(huì)執(zhí)行,直到1分16秒才有機(jī)會(huì)執(zhí)行第二次任務(wù),那么第3次的執(zhí)行時(shí)間將是1分21秒,偏移了1秒。
-          public void schedule(TimerTask task, long delay, long period)
-          public void schedule(TimerTask task, Date firstTime, long period)
 
2.2) 另一種是絕對(duì)時(shí)間法,以用戶設(shè)計(jì)的起始時(shí)間為基準(zhǔn),第n次執(zhí)行時(shí)間為“起始時(shí)間+n*周期時(shí)間”。比如,在上面的情況下,雖然因?yàn)橄到y(tǒng)繁忙,第二執(zhí)行時(shí)間被推后1秒,但第3次的時(shí)間點(diǎn)仍然應(yīng)該是1分20秒。
-          public void scheduleAtFixedRate(TimerTask task, long delay, long period)
-          public void scheduleAtFixedRate(TimerTask task, Date firstTime,                                    long period)
 
相 對(duì)時(shí)間法,關(guān)注于滿足短時(shí)間內(nèi)的執(zhí)行間隔,絕對(duì)時(shí)間法,則更關(guān)注在一個(gè)長時(shí)間范圍內(nèi),任務(wù)被執(zhí)行的次數(shù)。如果我們要編寫一個(gè)程序,用timer控制文檔編 輯器中提示光標(biāo)的閃爍,用哪種更合適? 當(dāng)然是相對(duì)時(shí)間法。如果改用絕對(duì)時(shí)間法,當(dāng)從系統(tǒng)繁忙狀態(tài)恢復(fù)后,光標(biāo)會(huì)快速連續(xù)閃爍多次,以彌補(bǔ)回在系統(tǒng)繁忙期間沒有被執(zhí)行的任務(wù),這樣的情況會(huì)用戶來 說比較難以接受。又如,每10分鐘檢查一次新郵件的到來,也適合于使用相對(duì)時(shí)間法。
Timer timer = new Timer();
                        TimerTask  task = new TimerTask (){
                         public void run() {
                                displayCursor();
                           }
};
              timer.schedule (task, 1000L, 1000L); //每秒閃爍一次光標(biāo)
 
作為對(duì)比,我們來考慮一種絕對(duì)時(shí)間法的應(yīng)用場景——倒數(shù)任務(wù),比如,要求在10秒內(nèi)做倒數(shù)計(jì)時(shí),每秒做一次doworkPerSecond操作,10秒結(jié)束時(shí)做一次doworkEnd操作,然后結(jié)束任務(wù)。
Timer timer = new Timer();
                        TimerTask  task = new TimerTask (){
                              private int count=10;
                              public void run() {
                                   if(count>0){
                                      doWorkPerSecond();
                                     count--;
                            }else{
                               doWorkEnd();
                               cancel();
                             }
                           }
};
                        timer. scheduleAtFixedRate (task, 1000L, 1000L);
Timer及相關(guān)類的內(nèi)部實(shí)現(xiàn)
Timer的內(nèi)部會(huì)啟動(dòng)一個(gè)線程TimerThread。即使有多個(gè)任務(wù)被加入這個(gè)Timer,它始終只有一個(gè)線程來管理這些任務(wù)。
-          TimerThread是Thread的子類。加入Timer的所有任務(wù)都會(huì)被最終放入TimerThread所管理的TaskQueue中。 TimerThread會(huì)不斷查看TaskQueue中的任務(wù),取出當(dāng)前時(shí)刻應(yīng)該被執(zhí)行的任務(wù)執(zhí)行之,并且會(huì)重新計(jì)算該任務(wù)的下一次執(zhí)行時(shí)間,重新放入 TaskQueue。直到所有任務(wù)執(zhí)行完畢(單次任務(wù))或者被cancel(重復(fù)執(zhí)行的任務(wù)),該線程才會(huì)結(jié)束。
-          TaskQueue,由數(shù)組實(shí)現(xiàn)的二叉堆,堆的排序是以任務(wù)的下一次執(zhí)行時(shí)間為依據(jù)的。二叉堆的使用使得TimerThread以簡潔高效的方式快速找到 當(dāng)前時(shí)刻需要執(zhí)行的TimerTask,因?yàn)椋雅判虻奶匦允潜WC最小(或者最大)值位于堆疊頂端,在這里,queue[1]始終是下次執(zhí)行時(shí)間 (nextExecutionTime)最小的,即應(yīng)該最先被執(zhí)行的任務(wù)
 
比如,同一個(gè)timer管理兩個(gè)任務(wù)task1和task2
timer.schedule (task1, 4000L, 10000L);
timer. scheduleAtFixedRate (task2, 2000L, 15000L);
則,TaskQueue 中會(huì)有兩個(gè)任務(wù):task1和task2。task2會(huì)排在頭部queue[1],當(dāng)task2執(zhí)行時(shí)間到,task2被執(zhí)行,同時(shí)修改其 nextExecutionTime =當(dāng)前的nextExecutionTime +15000L(絕對(duì)時(shí)間法)并重新在二叉堆中排序。排序后,task1被放到頭部。當(dāng)task1執(zhí)行時(shí)間到,task1被執(zhí)行,并修改其 nextExecutionTime =當(dāng)前時(shí)間+10000L,然后重新在二叉堆中對(duì)其排序………
 
一個(gè)例子
當(dāng)收到客戶端請(qǐng)求時(shí),服務(wù)端生成一個(gè)Response對(duì)象。服務(wù)端希望客戶端訪問該對(duì)象的間隔時(shí)間不能超過20秒,否則,服務(wù)端認(rèn)為客戶端已經(jīng)異常關(guān)閉或者網(wǎng)絡(luò)異常,此時(shí)銷毀掉該對(duì)象并打印錯(cuò)誤日志。每次訪問都會(huì)重新開始計(jì)時(shí)。
 
class Response{
private TimerTask  timeout;
            public void init(){
         ………
Timer timer = new Timer();
timeout = new TimeOutTask();
                        timer.schedule (timeout, 20000L);
}
 
public void invoke(){
    timeout.cancel();//取消當(dāng)前的timeout任務(wù)
; ….
   timeout = new TimeOutTask();
                           timer.schedule (timeout, 20000L);//重新開始計(jì)時(shí)
}
 
void destroy(){
   ……..
}
 
class TimeOutTask extends TimerTask{
           public void run() {
TraceTool.error(“Time out, destroy the Response object.”);
destroy();
                           }
}
}
 
因?yàn)門imer不支持對(duì)任務(wù)重置計(jì)時(shí),所以此處采取了先cancel當(dāng)前的任務(wù)再重新加入新任務(wù)來達(dá)到重置計(jì)時(shí)的目的。注意,對(duì)一個(gè)已經(jīng)cancel的任務(wù),不能通過schedule重新加入Timer中執(zhí)行。TimerTask的狀態(tài)機(jī)如下:
 

一個(gè)新生成的TimerTask其狀態(tài)為VIRGIN,Timer只接受狀態(tài)為VIRGIN的任務(wù),否則會(huì)有IllegalStateException異常拋出。
調(diào)用任務(wù)的cancel方法,該任務(wù)就轉(zhuǎn)入CANCELLED狀態(tài),并很快從TaskQueue中刪除。對(duì)單次執(zhí)行的任務(wù),一旦執(zhí)行結(jié)束,該任務(wù)也會(huì)從中刪除。這意味著TimerTask將不再被timer所執(zhí)行了。


本文來源【學(xué)網(wǎng)】網(wǎng)站鏈接是http://www.xue5.com

posted on 2012-06-10 00:14 大龍 閱讀(12354) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美黄色免费网站| 欧美日韩在线精品| 国产视频一区欧美| 另类酷文…触手系列精品集v1小说| 亚洲美女视频| 国产精品久久午夜夜伦鲁鲁| 亚洲一区3d动漫同人无遮挡| 日韩小视频在线观看| 国产精品日韩久久久久| 亚洲精品乱码久久久久久蜜桃麻豆| 久久野战av| 欧美成人一品| 亚洲乱亚洲高清| 亚洲综合色婷婷| 亚洲欧洲精品一区二区| 亚洲国产天堂久久综合| 国产精品久久久久久久久免费桃花 | 一区二区三区免费观看| 欧美小视频在线观看| 另类成人小视频在线| 免费成人av在线| 欧美在线日韩| 国产精品videosex极品| 欧美国产在线电影| 国产亚洲精品久久久久婷婷瑜伽| 欧美不卡激情三级在线观看| 国产精品麻豆成人av电影艾秋| 久久久久久久一区| 国产精品福利久久久| 亚洲级视频在线观看免费1级| 久久高清国产| 亚洲一区二区精品在线观看| 蜜臀av性久久久久蜜臀aⅴ| 久久久国产一区二区| 欧美性色综合| 国产精品一区二区久久久久| 亚洲天堂偷拍| 亚洲淫性视频| 国产欧美日韩| 亚洲第一在线综合网站| 欧美亚洲综合在线| 老司机一区二区| 亚洲国产精品va在线看黑人动漫 | 亚洲视频在线二区| 日韩亚洲综合在线| 亚洲精品专区| 加勒比av一区二区| 狂野欧美一区| 亚洲国产激情| 日韩视频在线播放| 欧美亚洲成人精品| 久久国产精品久久久| 亚洲国产视频a| 欧美在线日韩| 亚洲视频www| 亚洲精品在线免费观看视频| 国产日韩一区| 欧美日韩国产成人在线观看| 亚洲特色特黄| 欧美mv日韩mv国产网站app| 亚洲免费婷婷| 亚洲精品一区二区在线| 国产亚洲精品久久久久久| 乱人伦精品视频在线观看| 亚洲免费视频一区二区| 久久久午夜视频| 久久不射中文字幕| 亚洲欧美日韩成人| 亚洲深爱激情| 亚洲激情偷拍| 亚洲第一页在线| 欧美激情一区二区三区不卡| 久久免费视频观看| 久久久久天天天天| 欧美xx69| 国产精品入口日韩视频大尺度| 久久先锋影音| 亚洲一区二区三区乱码aⅴ| 亚洲精品社区| 亚洲免费在线精品一区| 午夜精品在线| 午夜精品免费视频| 亚洲一区二区毛片| 裸体一区二区三区| 亚洲精品视频啊美女在线直播| 日韩视频免费在线| 亚洲一区免费看| 久久久另类综合| 欧美日韩在线播放一区| 国产日韩综合| 亚洲日本国产| 亚洲欧美亚洲| 91久久午夜| 欧美中文字幕不卡| 国产欧美午夜| 亚洲一区二区影院| 欧美激情性爽国产精品17p| 一区二区三区国产盗摄| 在线亚洲电影| 久久综合久久美利坚合众国| 亚洲精品视频二区| 久久综合中文色婷婷| 黄色av日韩| 久久综合伊人77777| 日韩视频一区二区在线观看| 欧美国产高清| 国产日韩欧美亚洲一区| 一区二区精品在线| 玖玖精品视频| 午夜精彩视频在线观看不卡| 国产精品一区二区在线| 亚洲一区观看| 亚洲综合色噜噜狠狠| 国产一区二区三区高清| 另类天堂视频在线观看| 欧美一二三区精品| 国产一区香蕉久久| 欧美成人免费大片| 欧美精品九九| 在线午夜精品| 亚洲一级二级| 亚洲午夜久久久久久久久电影网| 欧美日韩国产色视频| 99精品视频免费| 亚洲视频一区| 精品不卡一区| 一本色道久久综合亚洲二区三区 | 久久琪琪电影院| 日韩一区二区免费看| 91久久精品国产91久久性色| 国产精品久久久久9999吃药| 午夜精品久久久久久久白皮肤 | 一级成人国产| 羞羞视频在线观看欧美| 国产日韩精品在线播放| 欧美大胆成人| 国产欧美视频一区二区| 亚洲高清在线播放| 国产曰批免费观看久久久| 艳女tv在线观看国产一区| 亚洲国产精品一区在线观看不卡| 亚洲一区二区三区涩| 亚洲视频第一页| 欧美国产亚洲另类动漫| 美女视频黄免费的久久| 欧美日韩国产成人在线观看| 欧美高清视频www夜色资源网| 国产精品丝袜xxxxxxx| 亚洲欧美日韩国产精品 | 欧美不卡在线视频| 欧美视频一区二区三区在线观看 | 欧美成人影音| 欧美激情国产高清| 在线观看视频免费一区二区三区| 性伦欧美刺激片在线观看| 久久久中精品2020中文| 亚洲大胆人体在线| 欧美日韩在线另类| 欧美一级二区| 国产一区二区三区精品久久久 | 久久久久久婷| 欧美aa在线视频| 亚洲最新在线视频| 国产日韩在线一区| 欧美精品色网| 狠狠色狠色综合曰曰| 久久综合一区| 亚洲一区二区三区高清| 久久久久国产精品人| 亚洲精品综合精品自拍| 国产精品久久久久久久久久三级| 香蕉视频成人在线观看| 免费在线一区二区| 欧美一区二视频| 在线中文字幕日韩| 亚洲精品精选| 日韩视频永久免费| 亚洲精品乱码久久久久久按摩观| 国产午夜精品久久久久久免费视| 欧美精品一区二区在线观看| 欧美亚洲在线视频| 亚洲小少妇裸体bbw| 亚洲日本成人网| 最新热久久免费视频| 欧美成人午夜激情在线| 美国三级日本三级久久99| 久久爱www久久做| 亚洲天堂av图片| 亚洲一区二区视频在线观看| 亚洲视屏一区| 亚洲欧美www| 久久久久久久综合| 美女网站在线免费欧美精品| 久久成人免费日本黄色| 久久久精品免费视频| 91久久夜色精品国产九色| 亚洲福利在线视频| 亚洲日韩欧美一区二区在线| 亚洲黑丝在线| 亚洲小少妇裸体bbw|