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

大龍的博客

常用鏈接

統計

最新評論

Java:如何正確使用Timer

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

一個新生成的TimerTask其狀態為VIRGIN,Timer只接受狀態為VIRGIN的任務,否則會有IllegalStateException異常拋出。
調用任務的cancel方法,該任務就轉入CANCELLED狀態,并很快從TaskQueue中刪除。對單次執行的任務,一旦執行結束,該任務也會從中刪除。這意味著TimerTask將不再被timer所執行了。


本文來源【學網】網站鏈接是http://www.xue5.com

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美亚洲成人免费| 欧美一级免费视频| 欧美一区二区三区视频在线| 亚洲伊人伊色伊影伊综合网| 午夜精品久久久久久久久| 亚洲欧美日本另类| 久久久久久久999精品视频| 免费视频亚洲| 99精品视频免费观看| 亚洲欧美资源在线| 看片网站欧美日韩| 欧美日韩综合网| 国模精品娜娜一二三区| 日韩视频在线免费观看| 亚洲欧美综合精品久久成人 | 日韩午夜中文字幕| 亚洲欧美日韩国产一区二区三区| 欧美在线亚洲一区| 欧美黄在线观看| 国产精品99久久久久久久久久久久 | 欧美日韩综合不卡| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲黄色在线观看| 久久精品91| 亚洲视频免费观看| 你懂的网址国产 欧美| 国产精品美女久久| 亚洲日韩欧美一区二区在线| 久久国产精品毛片| 日韩亚洲一区在线播放| 久久天堂精品| 国产亚洲精品高潮| 亚洲在线国产日韩欧美| 亚洲第一福利在线观看| 亚洲在线免费| 欧美日韩福利在线观看| 亚洲国产成人午夜在线一区 | 日韩香蕉视频| 欧美激情精品久久久久| 久久国产精品久久精品国产| 国产精品成人观看视频国产奇米| 亚洲人成艺术| 欧美成人免费在线观看| 久久精品国产欧美激情| 国产一区二区精品久久99| 午夜精品福利在线观看| 一区二区电影免费在线观看| 欧美日韩国产系列| 欧美日韩国产色站一区二区三区| 欧美大学生性色视频| 久久av老司机精品网站导航| 国产精品v欧美精品v日韩精品| 亚洲精品欧洲精品| 亚洲国产精品va| 欧美.日韩.国产.一区.二区| 在线精品视频一区二区| 免费在线欧美视频| 蜜月aⅴ免费一区二区三区| 亚洲黄色精品| 亚洲日本成人网| 欧美日韩精品| 欧美一级久久久| 亚洲欧美日韩在线观看a三区| 国产精品乱人伦一区二区| 亚洲欧美国产制服动漫| 亚洲欧美日韩一区二区在线 | 米奇777在线欧美播放| 亚洲电影av在线| 亚洲激情专区| 欧美日韩午夜在线| 午夜视频久久久| 欧美中文字幕第一页| 亚洲国产综合在线| 在线一区二区三区四区| 国产欧美一区二区视频| 你懂的视频一区二区| 欧美激情自拍| 午夜日韩电影| 狼狼综合久久久久综合网| 亚洲免费大片| 亚洲综合精品自拍| 在线观看欧美| 99re6这里只有精品| 国产精品毛片| 你懂的亚洲视频| 欧美黑人多人双交| 亚洲欧美日韩直播| 老司机一区二区| 亚洲在线观看视频| 久久亚洲私人国产精品va| 一区二区三区免费在线观看| 欧美中日韩免费视频| av成人免费在线| 欧美一区二区视频在线观看| 日韩写真在线| 久久久久免费视频| 亚洲午夜精品一区二区| 久久久www成人免费无遮挡大片| 亚洲最新合集| 久久久夜色精品亚洲| 香港成人在线视频| 欧美电影在线| 久久久五月婷婷| 国产精品久久久久久久久久直播 | 精品51国产黑色丝袜高跟鞋| 久久一区国产| 亚洲精品欧洲| 精品69视频一区二区三区| 亚洲最新视频在线| 最近中文字幕日韩精品| 久久国产手机看片| 亚洲欧美日韩国产成人精品影院| 麻豆精品视频在线| 久久黄金**| 国产精品日韩在线一区| 亚洲日本成人在线观看| 亚洲福利视频网| 久久精品理论片| 欧美伊久线香蕉线新在线| 欧美日韩一区二区三区在线 | 亚洲一区二区在线播放| 一区二区三区视频免费在线观看| 久久综合狠狠综合久久综青草| 欧美一区二区三区四区高清| 欧美午夜在线视频| 9色精品在线| 亚洲最新中文字幕| 欧美激情视频在线播放 | 久久大香伊蕉在人线观看热2| 香蕉视频成人在线观看| 国产精品第十页| 亚洲深夜影院| 午夜精品一区二区三区在线视| 国产精品久久久久久久浪潮网站| 国产精品99久久久久久有的能看| 一区二区三区黄色| 欧美日韩一区二区三区在线 | 欧美国产高潮xxxx1819| 亚洲激情成人在线| 99精品福利视频| 欧美精品一区二区久久婷婷| 亚洲精选一区| 亚洲欧美三级在线| 国产视频一区在线| 久久久久久网站| 欧美激情一区二区三区在线| 亚洲精品资源| 国产精品大片wwwwww| 羞羞色国产精品| 美女主播精品视频一二三四| 亚洲国产成人精品久久久国产成人一区| 久久午夜色播影院免费高清| 欧美激情视频一区二区三区不卡| 亚洲理伦电影| 国产精品羞羞答答| 久久在线91| 一区二区三区久久久| 久久精品九九| 亚洲乱码视频| 国产精品无码专区在线观看 | 国产伦精品一区二区三区视频孕妇 | 久久久夜夜夜| 99re6这里只有精品视频在线观看| 亚洲欧美成aⅴ人在线观看| 国产精品一区二区三区四区五区| 午夜精品久久久久久久蜜桃app | 欧美三级乱码| 欧美一区二区三区啪啪| 欧美国产日韩xxxxx| 亚洲一区精品在线| 在线精品国产成人综合| 欧美午夜精品久久久久久人妖| 久久高清免费观看| 亚洲精选久久| 六月婷婷久久| 亚洲欧美国产高清| 亚洲精品免费网站| 国产亚洲欧美另类中文| 欧美理论片在线观看| 久久久久久伊人| 亚洲主播在线| 99视频精品在线| 欧美大片一区| 久久久久一区二区| 亚洲一卡久久| 亚洲日本成人网| 狠狠色丁香婷婷综合久久片| 欧美日韩精品免费观看视频| 久久久久综合网| 亚洲午夜一区二区三区| 亚洲人成网站999久久久综合| 久久久精品久久久久| 午夜精品久久| 亚洲一区二区四区| 99视频+国产日韩欧美| 亚洲高清在线视频| 激情欧美丁香| 激情久久综艺| 激情综合色丁香一区二区| 国产亚洲成精品久久|