Timer和TimeTask簡介

Timer和TimeTask簡介


Timer是一種線程設施,用於安排之後在後臺線程中執行的任務。可安排任務執行一次,或者按期重複執行,能夠當作一個定時器,能夠調度TimerTask。TimerTask是一個抽象類,實現了Runnable接口,因此具有了多線程的能力。 java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java . util . TimerTask ;
public class MyTask extends TimerTask
{
private int id ;
public MyTask ( int id )
{
this . id = id ;
}
public void run ( )
{
System . out . println ( "線程" + id + ":正在執行" ) ;
//System.gc();
}
}

而後主程序代碼爲: 多線程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java . util . Date ;
import java . util . Timer ;
public class Test
{
public static void main ( String [ ] args )
{
Timer timer = new Timer ( ) ;
timer . schedule ( new MyTask ( 1 ) , 5000 ) ; // 5秒後啓動任務
MyTask secondTask = new MyTask ( 2 ) ;
timer . schedule ( secondTask , 1000 , 3000 ) ;
// 1秒後啓動任務,之後每隔3秒執行一次線程
Date date = new Date ( ) ;
timer . schedule ( new MyTask ( 3 ) , new Date ( date . getTime ( ) + 1000 ) ) ;
//      以date爲參數,指定某個時間點執行線程
//      timer.cancel();
//      secondTask.cancel();
System . out . println ( "main thread 結束!" ) ;
}
}

Timer裏面有4個schedule重載函數,並且還有兩個scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任務在指定的時間開始進行重複的固定速率執行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任務在指定的延遲後開始進行重複的固定速率執行。
使用scheduleAtFixedRate的話,Timer會盡可能的讓任務在一個固定的頻率下運行。例如:在上面的例子中,讓secondTask在1秒鐘後,每3秒鐘執行一次,可是由於java不是實時的,因此,咱們在上個程序中表達的原義並不可以嚴格執行,例若有時可能資源調度緊張4秒之後才執行下一次,有時候又3.5秒執行。若是咱們調用的是scheduleAtFixedRate,那麼Timer會盡可能讓你的secondTask執行的頻率保持在3秒一次。運行上面的程序,假設使用的是scheduleAtFixedRate,那麼下面的場景就是可能的:1秒鐘後,secondTask執行一次,由於系統繁忙,以後的3.5秒後secondTask才得以執行第二次,而後Timer記下了這個延遲,並嘗試在下一個任務的時候彌補這個延遲,那麼2.5秒後,secondTask將執行的三次。「以固定的頻率而不是固定的延遲時間去執行一個任務」就是這個意思。
Timer終止的問題:
默認狀況下,只要一個程序的timer線程在運行,那麼這個程序就會保持運行。能夠經過如下3種方法終止一個timer線程:
(1)調用timer的cancle方法。你能夠從程序的任何地方調用此方法,甚至在一個timer task的run方法裏;
(2)讓timer線程成爲一個daemon線程(能夠在建立timer時使用new Timer(true)達到這個目地),這樣當程序只有daemon線程的時候,它就會自動終止運行;
(3)調用System.exit方法,使整個程序(全部線程)終止。
TimerTask也有cancel方法。
上面所說的「只要一個程序的timer線程在運行,那麼這個程序就會保持運行」。那麼反過來,若是Timer裏的全部TimerTask都執行完了,整個程序會退出嗎,經測試是否認的,例如上面的測試代碼,若是隻加第一個TimerTask在Timer中執行:
timer.schedule(new MyTask(1), 5000);// 5秒後啓動任務
那麼5秒之後,其實整個程序仍是沒有退出,Timer會等待垃圾回收的時候被回收掉而後程序會得以退出,可是多長時間呢?在TimerTask的run函數執行完之後加上System.gc();就能夠了。 ide

Java定時調度 Timer類和TimerTask類


 

  Timer類是一種線程設施,能夠用來實現某一個時間或某一段時間後安排某一個任務執行一次或按期重複執行。該功能和TimerTask配合使用。TimerTask類用於實現由Timer安排的一次或重複執行的某個任務。每個Timer對象對應的是一個線程,所以計時器所執行的任務應該迅速完成,不然會延遲後續的任務執行。 
  Timer類方法摘要 
函數

Java代碼   收藏代碼
  1. void cancel()   
  2.           終止此計時器,丟棄全部當前已安排的任務。   
  3.  int purge()   
  4.           今後計時器的任務隊列中移除全部已取消的任務。   
  5.  void schedule(TimerTask task, Date time)   
  6.           安排在指定的時間執行指定的任務。   
  7.  void schedule(TimerTask task, Date firstTime, long period)   
  8.           安排指定的任務在指定的時間開始進行重複的固定延遲執行。   
  9.  void schedule(TimerTask task, long delay)   
  10.           安排在指定延遲後執行指定的任務。   
  11.  void schedule(TimerTask task, long delay, long period)   
  12.           安排指定的任務從指定的延遲後開始進行重複的固定延遲執行。   
  13.  void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)   
  14.           安排指定的任務在指定的時間開始進行重複的固定速率執行。   
  15.  void scheduleAtFixedRate(TimerTask task, long delay, long period)   
  16.           安排指定的任務在指定的延遲後開始進行重複的固定速率執行。   


TimerTask類方法摘要 
Java代碼  
  1. boolean cancel()   
  2.           取消此計時器任務。   
  3. abstract  void run()   
  4.           此計時器任務要執行的操做。   
  5.  long scheduledExecutionTime()   
  6.           返回此任務最近實際 執行的已安排 執行時間。   


TimerTask類是個抽象類,若是要用該類,須要本身創建一個類來繼承此類,並實現其中的抽象方法。 

Java代碼  收藏代碼package zzs.time.demo;   測試



  1.   
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Date;  
  4. import java.util.TimerTask;  
  5.   
  6. public class MyTask extends TimerTask {  
  7.   
  8.     @Override  
  9.     public void run() {  
  10.         // TODO Auto-generated method stub  
  11.         SimpleDateFormat simpleDateFormat=null;  
  12.         simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");  
  13.         System.out.println("當前的系統時間爲:"+simpleDateFormat.format(new Date()));  
  14.   
  15.     }  
  16.   
  17. }  



Java代碼   收藏代碼
  1. package zzs.time.demo;  
  2.   
  3. import java.util.Timer;  
  4.   
  5. public class TestTask {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      * @throws InterruptedException  
  10.      */  
  11.     public static void main(String[] args) throws InterruptedException {  
  12.         // TODO Auto-generated method stub  
  13.         Timer  timer=new Timer();  
  14.         MyTask myTask=new MyTask();  
  15.         timer.schedule(myTask, 10002000);  
  16.                // Thread.sleep(5000);  
  17.         //timer.cancel();  
  18.   
  19.     }  
  20. }  


運行結果: 
Java代碼   收藏代碼
  1. 當前的系統時間爲:2011-07-10 15:37:44:831  
  2. 當前的系統時間爲:2011-07-10 15:37:46:786  
  3. 當前的系統時間爲:2011-07-10 15:37:48:786  
  4. 當前的系統時間爲:2011-07-10 15:37:50:786  
  5. 當前的系統時間爲:2011-07-10 15:37:52:786  
  6. 當前的系統時間爲:2011-07-10 15:37:54:786  

相關文章
相關標籤/搜索