Java计划任务: timer.schedule实例

时间:2022-06-10 02:04:43
 

 

如果您想要在某個時間點之後,執行某項排定的任務,您可以定義一個TimerTask,再將之排定給Timer,Timer會依指定的時間來執行TimerTask。

舉個實例來說,您想在程式啟動後5秒鐘執行報時,則您可以繼承TimerTask,並重新定義其run()方法。 
DateTask.java

 

[java]  view plain copy
 
  1. pakage onlyfun.caterpillar;  
  2.   
  3. import java.util.*;  
  4.   
  5. public class DateTask extends TimerTask {  
  6.     public void run() {  
  7.         System.out.println("任務時間:" + new Date());  
  8.     }  
  9. }  
 

  在run()方法中,只簡單的顯示run()方法被執行的時間,TimerTask的排程執行要交給Timer物件,例如:
Main.java

 

[java]  view plain copy
 
  1. package onlyfun.caterpillar;  
  2.   
  3. import java.util.*;  
  4.   
  5. public class Main {  
  6.     public static void main(String[] args) {  
  7.         Timer timer = new Timer();  
  8.         timer.schedule(new DateTask(), 5000);  
  9.         System.out.println("現在時間:" + new Date());  
  10.   
  11.         try {  
  12.             Thread.sleep(8000);  
  13.         }  
  14.         catch(InterruptedException e) {  
  15.         }  
  16.   
  17.         timer.cancel();   
  18.     }  
  19. }  
 

  Timer物件的schedule()方法接受TimerTask實例,並可以給它一個毫秒數,表示schedule()方法執行後,幾毫秒之後執行 TimerTask中的run()方法,Timer物件在啟動排程後,如果要停止,則要執行cancel()方法,這個程式的執行結果如下:

現在時間:Fri Jan 19 10:47:10 CST 2007
任務時間:Fri Jan 19 10:47:15 CST 2007


除了指定幾毫秒之後執行任務之外,您還可以要求Timer物件,每隔多少時間就執行一次TimerTask的run()方法,例如一秒後開始執行TimerTask,而後每隔3秒執行一次:
Main.java

 

[java]  view plain copy
 
  1. package onlyfun.caterpillar;  
  2.   
  3. import java.util.*;  
  4.   
  5. public class Main {  
  6.     public static void main(String[] args) {  
  7.         Timer timer = new Timer();  
  8.         timer.schedule(new DateTask(), 1000, 3000);  
  9.         System.out.println("現在時間:" + new Date());  
  10.   
  11.         try {  
  12.             Thread.sleep(20000);  
  13.         }  
  14.         catch(InterruptedException e) {  
  15.         }  
  16.   
  17.         timer.cancel();  
  18.     }  
  19. }  

 執行結果如下:

現在時間:Fri Jan 19 10:49:43 CST 2007
任務時間:Fri Jan 19 10:49:44 CST 2007
任務時間:Fri Jan 19 10:49:47 CST 2007
任務時間:Fri Jan 19 10:49:50 CST 2007
任務時間:Fri Jan 19 10:49:53 CST 2007
任務時間:Fri Jan 19 10:49:56 CST 2007
任務時間:Fri Jan 19 10:49:59 CST 2007
任務時間:Fri Jan 19 10:50:02 CST 2007


 Timer的schedule()方法也可以接受Date實例,例如您想直接排定執行日為一個月之後,則可以透過Calendar來計算,再取得Date時間:
   

[java]  view plain copy
 
  1. Calendar c = Calendar.getInstance();  
  2.  c.add(Calendar.MONTH, 1);  
  3.  System.out.println("任務排定時間:" + c.getTime());  
  4.   
  5.  Timer timer = new Timer();  
  6.  timer.schedule(new DateTask(), c.getTime(), 3000);  

 
Timer與TimerTask是獨立的兩個物件,當使用Timer的schedule()方法排定TimerTask之後,則必須等執行Timer的 cancel()執行之後,讓TimerTask與Timer脫離關係,TimerTask才可以重新加入其它Timer的排程。

 

我之前用timer.schedule()方法,程序只运行很短的一瞬间就停了,现在才知道是没有让线程睡觉。文中Thread.sleep(8000)的部分!