Java定時更新數據—定時器 – JAVA編程語言程序開發技術文章

        在應用開發中,經常需要一些周期性的操作,比如每5分鐘執行某一操作等。這次,在我們的開發中,就有這麼一個需求.某個功能執行需要的時間比較長,則決定采用定時器的方式,每隔一段時間系統自動執行此功能,當界面真正觸發時,隻需要簡單的讀取結果,而不需要執行復雜的邏輯判斷.那如何實現此功能呢?要想實現它,首先我們需要認識瞭解幾個jdk封裝的類.

        Java.util.Timer:一種線程設施,用於安排以後再後臺線程中執行的任務.可安排任務執行一次或者定期重復執行.其中幾個方法需要我們註意一下:

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

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

schedule(TimerTask task, Date firstTime, long period):安排指定的任務在指定的時間開始進行重復的固定延遲執行。

schedule(TimerTask task, long delay):安排在指定延遲後執行指定的任務。

schedule(TimerTask task, long delay, long period) :安排指定的任務從指定的延遲後開始進行重復的固定延遲執行。

scheduleAtFixedRate(TimerTask task, Date firstTime, long period) :安排指定的任務在指定的時間開始進行重復的固定速率執行。

scheduleAtFixedRate(TimerTask task, long delay, long period) :安排指定的任務在指定的延遲後開始進行重復的固定速率執行。

        在上面提到的Timer的幾個方法中,參數中都涉及到瞭TimerTask類.那TimerTask類是幹嘛的呢?他就是Timer所安排的任務.即被設置的要執行一次或多次的任務.這個類中下面這幾個方法需要我們多加註意.

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

run():此計時器任務要執行的操作。這裡是具體操作的代碼實現.

 

        通過Timer和TimerTask兩個類,我們就能實現任務的重復執行瞭.但是,我們並沒有事情執行的起止點.我們不要人為的去觸發事情的執行,我們要通過代碼讓服務自己去執行.這樣,我們就需要一個監聽,去監聽當前是否符合執行的條件.ServletContextListener為我們實現此功能.此接口能夠監聽ServletContext對象的生命周期,實際上就是監聽Web應用的生命周期.當Servlet容器啟動或終止Web應用時,會觸發ServletContextEvent事件,該事件由ServletContextListener來處理.涉及到的兩個方法為:

contextInitialized(ServletContextEvent sce);初始化;

contextDestroyed(ServletContextEvent sce)銷毀

       到這裡,準備工作就做好瞭.下面我們來看一個例子定時器具體是怎樣實現的.

     

[java]
package com.boco.transnms.server.bo.stat; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
public class NFDFlightDataTaskListener implements ServletContextListener{ 
    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 
        //銷毀時的代碼  
    } 
    @Override 
        //在服務啟動時,執行此方法。  
    public void contextInitialized(ServletContextEvent arg0) { 
        new TimerManager(); 
    } 

//要執行的任務  
class NFDFlightDataTimerTask extends TimerTask{ 
    @Override 
    //此方法為具體要定時操作的方法  
    public void run() { 
     System.out.println("定時器測試:"+System.currentTimeMillis()); 
    } 

class TimerManager{ 
    private static final long PERIOD_DAY=6 * 1000;  //每隔六秒執行一次  
    public TimerManager() {                    
        Timer timer = new Timer();     //定時器實例化   
         NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();   //要執行的任務  
         //安排指定的任務在指定的時間開始進行重復的固定延遲執行。     
              timer.schedule(task,new Date(),PERIOD_DAY);   
       }     

package com.boco.transnms.server.bo.stat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class NFDFlightDataTaskListener implements ServletContextListener{
 @Override
 public void contextDestroyed(ServletContextEvent arg0) {
  //銷毀時的代碼
 }
 @Override
        //在服務啟動時,執行此方法。
 public void contextInitialized(ServletContextEvent arg0) {
     new TimerManager();
 }
}
//要執行的任務
class NFDFlightDataTimerTask extends TimerTask{
 @Override
 //此方法為具體要定時操作的方法
 public void run() {
  System.out.println("定時器測試:"+System.currentTimeMillis());
 }
}
class TimerManager{
 private static final long PERIOD_DAY=6 * 1000;  //每隔六秒執行一次
 public TimerManager() {                  
     Timer timer = new Timer();     //定時器實例化
      NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();   //要執行的任務
      //安排指定的任務在指定的時間開始進行重復的固定延遲執行。  
              timer.schedule(task,new Date(),PERIOD_DAY); 
       }   
}
 

       既然監聽是在服務啟動的時候就有瞭,自然離不開配置文件瞭。那web.xml配置文件是如何配置的呢?

[html] view plaincopyprint?<listener> 
 
         <!—此處為實現監聽接口的完整的包名類名–> 
 
       <listener-class> 
 
                com.boco.transnms.server.bo.stat.NFDFlightDataTaskListener 
 
       </listener-class> 
 
</listener> 

<listener>

         <!—此處為實現監聽接口的完整的包名類名–>

       <listener-class>

                com.boco.transnms.server.bo.stat.NFDFlightDataTaskListener

       </listener-class>

</listener>

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。