成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Timer和TimerTask詳解

開發(fā) 后端
本文主要介紹了Timer和TimerTask這兩個工具,而以下內(nèi)容根據(jù)The JavaTM Tutorial和相關API doc翻譯整理,以供日后參考:

以下內(nèi)容根據(jù) The JavaTM Tutorial 和相關API doc翻譯整理,以供日后參考:

1.概覽

Timer是一種定時器工具,用來在一個后臺線程計劃執(zhí)行指定任務。它可以計劃執(zhí)行一個任務一次或反復多次。

TimerTask一個抽象類,它的子類代表一個可以被Timer計劃的任務。

簡單的一個例程:

  1. import java.util.Timer;  
  2. import java.util.TimerTask;  
  3.  
  4. /**  
  5. * Simple demo that uses java.util.Timer to schedule a task to execute  
  6. * once 5 seconds have passed.  
  7. */ 
  8.  
  9. public class Reminder {  
  10.     Timer timer;  
  11.  
  12.     public Reminder(int seconds) {  
  13.         timer = new Timer();  
  14.         timer.schedule(new RemindTask(), seconds*1000);  
  15.     }  
  16.  
  17.     class RemindTask extends TimerTask {  
  18.         public void run() {  
  19.             System.out.println("Time's up!");  
  20.             timer.cancel(); //Terminate the timer thread  
  21.         }  
  22.     }  
  23.  
  24.     public static void main(String args[]) {  
  25.         System.out.println("About to schedule task.");  
  26.         new Reminder(5);  
  27.         System.out.println("Task scheduled.");  
  28.     }  
  29. }  

運行這個小例子,你會首先看到:

About to schedule task.

5秒鐘之后你會看到:

Time's up!

這個小例子可以說明一些用Timer線程實現(xiàn)和計劃執(zhí)行一個任務的基礎步驟:

  •  實現(xiàn)自定義的TimerTask的子類,run方法包含要執(zhí)行的任務代碼,在這個例子里,這個子類就是RemindTask。
  • 實例化Timer類,創(chuàng)建計時器后臺線程。
  • 實例化任務對象 (new RemindTask()).
  • 制定執(zhí)行計劃。這里用schedule方法,***個參數(shù)是TimerTask對象,第二個參數(shù)表示開始執(zhí)行前的延時時間(單位是milliseconds,這里定義了5000)。還有一種方法可以指定任務的執(zhí)行時間,如下例,指定任務在11:01 p.m.執(zhí)行:
  1. //Get the Date corresponding to 11:01:00 pm today.  
  2. Calendar calendar = Calendar.getInstance();  
  3. calendar.set(Calendar.HOUR_OF_DAY, 23);  
  4. calendar.set(Calendar.MINUTE, 1);  
  5. calendar.set(Calendar.SECOND, 0);  
  6. Date time = calendar.getTime();  
  7.  
  8. timer = new Timer();  
  9. timer.schedule(new RemindTask(), time); 

2.終止Timer線程

默認情況下,只要一個程序的timer線程在運行,那么這個程序就會保持運行。當然,你可以通過以下四種方法終止一個timer線程:

調(diào)用timer的cancle方法。你可以從程序的任何地方調(diào)用此方法,甚至在一個timer task的run方法里。

讓timer線程成為一個daemon線程(可以在創(chuàng)建timer時使用new Timer(true)達到這個目地),這樣當程序只有daemon線程的時候,它就會自動終止運行。

當timer相關的所有task執(zhí)行完畢以后,刪除所有此timer對象的引用(置成null),這樣timer線程也會終止。

調(diào)用System.exit方法,使整個程序(所有線程)終止。

Reminder的例子使用了***種方式。在這里不能使用第二種方式,因為這里需要程序保持運行直到timer的任務執(zhí)行完成,如果設成daemon,那么當main線程結(jié)束的時候,程序只剩下timer這個daemon線程,于是程序不會等timer線程執(zhí)行task就終止了。

有些時候,程序的終止與否并不只與timer線程有關。舉個例子,如果我們使用AWT來beep,那么AWT會自動創(chuàng)建一個非daemon線程來保持程序的運行。

  1. import java.util.Timer;  
  2. import java.util.TimerTask;  
  3. import java.awt.Toolkit;  
  4.  
  5. /**  
  6. * Simple demo that uses java.util.Timer to schedule a task to execute  
  7. * once 5 seconds have passed.  
  8. */ 
  9.  
  10. public class ReminderBeep {  
  11.     Toolkit toolkit;  
  12.     Timer timer;  
  13.  
  14.     public ReminderBeep(int seconds) {  
  15.         toolkit = Toolkit.getDefaultToolkit();  
  16.         timer = new Timer();  
  17.         timer.schedule(new RemindTask(), seconds*1000);  
  18.     }  
  19.  
  20.     class RemindTask extends TimerTask {  
  21.         public void run() {  
  22.             System.out.println("Time's up!");  
  23.     toolkit.beep();  
  24.     //timer.cancel(); //Not necessary because we call System.exit  
  25.     System.exit(0);   //Stops the AWT thread (and everything else)  
  26.         }  
  27.     }  
  28.  
  29.     public static void main(String args[]) {  
  30. System.out.println("About to schedule task.");  
  31.         new ReminderBeep(5);  
  32. System.out.println("Task scheduled.");  
  33.     }  

3.反復執(zhí)行一個任務

先看一個例子:

  1. public class AnnoyingBeep {  
  2.     Toolkit toolkit;  
  3.     Timer timer;  
  4.  
  5.     public AnnoyingBeep() {  
  6.         toolkit = Toolkit.getDefaultToolkit();  
  7.         timer = new Timer();  
  8.         timer.schedule(new RemindTask(),  
  9.                0,        //initial delay  
  10.                1*1000);  //subsequent rate  
  11.     }  
  12.  
  13.     class RemindTask extends TimerTask {  
  14.         int numWarningBeeps = 3;  
  15.  
  16.         public void run() {  
  17.             if (numWarningBeeps > 0) {  
  18.                 toolkit.beep();  
  19.                 System.out.println("Beep!");  
  20.                 numWarningBeeps--;  
  21.             } else {  
  22.                 toolkit.beep();   
  23.                 System.out.println("Time's up!");  
  24.                 //timer.cancel(); //Not necessary because we call System.exit  
  25.                 System.exit(0);   //Stops the AWT thread (and everything else)  
  26.             }  
  27.         }  
  28.     }  
  29.     ...  
  30. }   

執(zhí)行,你會看到如下輸出:

  1. Task scheduled.  
  2. Beep!   
  3. Beep! //one second after the first beep  
  4. Beep! //one second after the second beep  
  5. Time's up! //one second after the third beep 

這里使用了三個參數(shù)的schedule方法用來指定task每隔一秒執(zhí)行一次。如下所列為所有Timer類用來制定計劃反復執(zhí)行task的方法 :

  •  schedule(TimerTask task, long delay, long period)
  • schedule(TimerTask task, Date time, long period)
  • scheduleAtFixedRate(TimerTask task, long delay, long period)
  • scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

當計劃反復執(zhí)行的任務時,如果你注重任務執(zhí)行的平滑度,那么請使用schedule方法,如果你在乎的是任務的執(zhí)行頻度那么使用scheduleAtFixedRate方法。 例如,這里使用了schedule方法,這就意味著所有beep之間的時間間隔至少為1秒,也就是說,如果有一個beap因為某種原因遲到了(未按計劃執(zhí)行),那么余下的所有beep都要延時執(zhí)行。如果我們想讓這個程序正好在3秒以后終止,無論哪一個beep因為什么原因被延時,那么我們需要使用scheduleAtFixedRate方法,這樣當***個beep遲到時,那么后面的beep就會以最快的速度緊密執(zhí)行(***限度的壓縮間隔時間)。

4.進一步分析schedule和scheduleAtFixedRate

(1)2個參數(shù)的schedule在制定任務計劃時, 如果指定的計劃執(zhí)行時間scheduledExecutionTime<=systemCurrentTime,則task會被立即執(zhí)行。scheduledExecutionTime不會因為某一個task的過度執(zhí)行而改變。

(2)3個參數(shù)的schedule在制定反復執(zhí)行一個task的計劃時,每一次執(zhí)行這個task的計劃執(zhí)行時間隨著前一次的實際執(zhí)行時間而變,也就是scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是說如果第n次執(zhí)行task時,由于某種原因這次執(zhí)行時間過長,執(zhí)行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),則此時不做時隔等待,立即執(zhí)行第n+1次task,而接下來的第n+2次task的scheduledExecutionTime(第n+2次)就隨著變成了realExecutionTime(第n+1次)+periodTime。說白了,這個方法更注重保持間隔時間的穩(wěn)定。

(3)3個參數(shù)的scheduleAtFixedRate在制定反復執(zhí)行一個task的計劃時,每一次執(zhí)行這個task的計劃執(zhí)行時間在最初就被定下來了,也就是scheduledExecutionTime(第n次)=firstExecuteTime+n*periodTime;如果第n次執(zhí)行task時,由于某種原因這次執(zhí)行時間過長,執(zhí)行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),則此時不做period間隔等待,立即執(zhí)行第n+1次task,而接下來的第n+2次的task的scheduledExecutionTime(第n+2次)依然還是firstExecuteTime+(n+2)*periodTime這在***次執(zhí)行task就定下來了。說白了,這個方法更注重保持執(zhí)行頻率的穩(wěn)定。

5.一些注意的問題

  • 每一個Timer僅對應唯一一個線程。
  • Timer不保證任務執(zhí)行的十分精確。
  • Timer類的線程安全的。

原文鏈接:http://blog.csdn.net/xiaozhang0731/article/details/5688345

【編輯推薦】

  1. 在JDK和Eclipse下Java Applet的編寫和運行方式
  2. Java中的Enum的使用與分析
  3. 按權重選取目標的Java算法
  4. 通用Java文件上傳和下載組件的設計與實現(xiàn)
  5. 5種JavaScript調(diào)用函數(shù)的方法
責任編輯:林師授 來源: xiaozhang0731的博客
相關推薦

2009-09-07 05:50:59

C# Timer用法

2009-06-16 11:39:17

JBoss端口修改

2009-06-18 10:27:42

Spring Time

2021-07-30 15:50:54

Python定時器JavaScrip

2023-10-07 08:26:40

多線程數(shù)據(jù)傳遞數(shù)據(jù)共享

2010-01-28 09:45:16

Android Tim

2011-05-31 16:50:35

Android 線程

2012-05-08 13:58:37

SharePoint

2009-08-25 13:38:35

C# Timer組件

2009-07-17 16:32:34

Timer對象Swing

2019-01-21 15:57:29

VLANVXLAN局域網(wǎng)

2009-07-21 13:43:53

ASP和JSP比較

2017-04-26 08:51:36

MongoDB集群實戰(zhàn)

2011-04-02 09:17:38

2009-06-11 10:00:50

Glassfish安裝GlassFish配置

2009-06-22 16:19:45

JavaBeansEJBPOJO

2010-02-03 15:58:51

C++ timer

2009-07-29 16:08:07

ASP和ASP.NET

2013-12-02 09:49:59

2016-03-28 10:39:05

Python迭代迭代器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕三区 | 亚洲色图在线观看 | 亚洲一区二区三区免费视频 | 国产亚洲精品久久久久动 | 成人在线电影网站 | 色婷婷av777| 欧美久久视频 | 中文字幕一区二区三区四区 | 天天精品在线 | 国产精品入口 | 天天久久| 欧美日韩国产在线观看 | 成人精品一区 | 日韩欧美成人一区二区三区 | 国产a视频 | 操久久 | 在线视频久久 | 国产精品久久久久久久久久久久 | 欧洲亚洲视频 | 色婷婷国产精品 | 国产精品视频一区二区三区 | 精精国产xxxx视频在线野外 | av手机免费在线观看 | 免费xxxx大片国产在线 | 国产亚韩 | 免费亚洲网站 | 中文字幕国产视频 | 日韩亚洲视频 | 欧美国产一区二区三区 | 中文在线a在线 | 日韩在线观看网站 | 亚洲视频区| 日本精品视频一区二区三区四区 | 91精品国产日韩91久久久久久 | 国产日韩精品视频 | 国产麻豆乱码精品一区二区三区 | 久久久久国产一区二区三区不卡 | 99精品一区二区 | 黄频免费 | 国产色在线 | 亚洲av一级毛片 |