Java 中Timer和TimerTask 定時器和定時任務使用的例子


這兩個類使用起來非常方便,可以完成我們對定時器的絕大多數需求 

Timer類是用來執行任務的類,它接受一個TimerTask做參數 

Timer有兩種執行任務的模式,最常用的是schedule,它可以以兩種方式執行任務:1:在某個時間(Data),2:在某個固定的時間之后(int delay).這兩種方式都可以指定任務執行的頻率

 

TimerTest.java:

 

[java]  view plain  copy
 
  1. package com.cn;  
  2. import java.io.IOException;  
  3. import java.util.Timer;  
  4.     
  5. public class TimerTest{     
  6.            
  7.     public static void main(String[] args){     
  8.         Timer timer = new Timer();     
  9.         timer.schedule(new MyTask(), 1000, 2000);//在1秒后執行此任務,每次間隔2秒執行一次,如果傳遞一個Data參數,就可以在某個固定的時間執行這個任務.     
  10.         while(true){//這個是用來停止此任務的,否則就一直循環執行此任務     
  11.             try{     
  12.                 int in = System.in.read();    
  13.                 if(in == 's'){     
  14.                     timer.cancel();//使用這個方法退出任務     
  15.                     break;  
  16.                 }     
  17.             } catch (IOException e){     
  18.                 // TODO Auto-generated catch block     
  19.                 e.printStackTrace();     
  20.             }     
  21.         }     
  22.     }    
  23.       
  24.     static class MyTask extends java.util.TimerTask{      
  25.         public void run(){     
  26.             System.out.println("________");     
  27.         }     
  28.     }    
  29. }  

此類運行時:

程序啟動1秒后在控制台打印“————”

間隔兩秒后接着執行MyTask的run()方法,打印“————”

這樣一直循環

當在控制台輸入s字符時,timer定時器取消工作

跳出整個循環

程序運行結束!

 

TimerTest2.java:

 

[java]  view plain  copy
 
  1. package com.cn;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Date;  
  5. import java.util.Timer;  
  6.   
  7. public class TimerTest2{     
  8.         
  9.     public static void main(String[] args){     
  10.         Timer timer = new Timer();     
  11.         MyTask myTask1 = new MyTask();     
  12.         MyTask myTask2 = new MyTask();     
  13.         myTask2.setInfo("myTask-info-2");     
  14.           
  15.         timer.schedule(myTask1, 1000, 2000);  //任務1 一秒鍾后執行,每兩秒執行一次。   
  16.         timer.scheduleAtFixedRate(myTask2, 2000, 3000);   //任務2 2秒后開始進行重復的固定速率執行(3秒鍾重復一次)  
  17.           
  18.         while (true){     
  19.             try{     
  20.                 //用來接收鍵盤輸入的字符串  
  21.                 byte[] info = new byte[1024];     
  22.                 int len = System.in.read(info);    
  23.                   
  24.                 String strInfo = new String(info, 0, len, "GBK");//從控制台讀出信息     
  25.                   
  26.                 if (strInfo.charAt(strInfo.length() - 1) == ' '){     
  27.                     strInfo = strInfo.substring(0, strInfo.length() - 2);     
  28.                 }    
  29.                   
  30.                 if (strInfo.startsWith("Cancel-1")){     
  31.                     myTask1.cancel();//退出任務1     
  32.                     // 其實應該在這里判斷myTask2是否也退出了,是的話就應該break.但是因為無法在包外得到     
  33.                     // myTask2的狀態,所以,這里不能做出是否退出循環的判斷.     
  34.                 } else if (strInfo.startsWith("Cancel-2")){     
  35.                     myTask2.cancel();  //退出任務2   
  36.                 } else if (strInfo.startsWith("Cancel-All")){     
  37.                     timer.cancel();//退出Timer     
  38.                     break;     
  39.                 } else{     
  40.                     // 只對myTask1作出判斷,偷個懶^_^     
  41.                     myTask1.setInfo(strInfo);     
  42.                 }     
  43.             } catch (IOException e){     
  44.                 // TODO Auto-generated catch block     
  45.                 e.printStackTrace();     
  46.             }     
  47.         }     
  48.     }     
  49.     
  50.     static class MyTask extends java.util.TimerTask{     
  51.           
  52.         String info = "INFO";  
  53.     
  54.         @Override     
  55.         public void run(){     
  56.             // TODO Auto-generated method stub     
  57.             System.out.println(new Date() + "      " + info);     
  58.         }     
  59.     
  60.         public String getInfo(){     
  61.             return info;     
  62.         }     
  63.         public void setInfo(String info){     
  64.             this.info = info;     
  65.         }     
  66.     }     
  67.       
  68. }     


此類創建了兩個定時任務mytask1和mytask2 

mytask1任務和上面的TimerTest類中的例子用法一樣。即安排指定的任務從指定的延遲后開始進行重復的固定延遲執行。

mytask2任務就不同於上面的用法了,timer.scheduleAtFixedRate它是用的timer定時器的scheduleAtFixedRate()方法來執行。

scheduleAtFixedRate()方法在API1.6.0中是這樣定義的:

安排指定的任務在指定的時間開始進行重復的固定速率執行。以近似固定的時間間隔(由指定的周期分隔)進行后續執行。

近似固定的時間間隔的意思是說:在固定速率執行中,相對於已安排的初始執行時間來安排每次執行。如果由於任何原因(如垃圾回收或其他后台活動)而延遲了某次執行,則將快速連續地出現兩次或更多次執行,從而使后續執行能夠趕上來。

 

 

Timer類的常用其他方法:

cancel() 
終止此計時器,丟棄所有當前已安排的任務。

purge() 
從此計時器的任務隊列中移除所有已取消的任務。

schedule(TimerTask task, Date time) 
安排在指定的時間執行指定的任務。

 

TimerTask類的常用其他方法:

cancel() 
取消此計時器任務。

run() 
此計時器任務要執行的操作。

scheduledExecutionTime() 
返回此任務最近實際 執行的已安排 執行時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM