2012-10-30 48 views
0

我想重啓我的計時器,當我收到一個KeepAlive,問題是有時它不會重新啓動,而不是它創建一個新的,所以,最後計時器達到極限:重啓計時器失敗

public class KeepAliveTimer { 


long macAddress; 
Timer timer; 
String ip; 


public KeepAliveTimer(long mac, String ipAddress){ 
    this.macAddress = mac; 
    this.ip = ipAddress; 

    timer = new Timer(); 

    TimerTask timerTask = new TimerTask() { 

     @Override 
     public void run() { 

      timerFinished(); 

     } 
    }; 

    timer.schedule(timerTask, 10*60*1000); 
} 


public void update() { 


    TimerTask timerTask = new TimerTask() { 

     @Override 
     public void run() { 
      timerFinished(); 

     } 
    }; 
    timer.cancel(); 
    timer.purge(); 
    timer = new Timer(); 
    timer.schedule(timerTask, 10*60*1000); 
} 

public void timerFinished() { 

    //tasks 
} 

} 

對象KeepAliveTimer時按照那些

+0

你在哪裏使用這個在webapp(servlets)或正常的java項目? – sunleo

+0

正常的java項目 – user1256477

+0

你在哪裏重新啓動定時器,你可以告訴我在這段代碼中? – sunleo

回答

1

你不應該取消整個定時器,但只有TimerTask收到的第一個活動和更新的創建。這是我如何寫你的代碼:

public class KeepAliveTimer { 
    final Timer timer = new Timer(); 
    final long macAddress; 
    final String ip; 
    volatile TimerTask timerTask; 

    public KeepAliveTimer(long mac, String ipAddress) { 
    this.macAddress = mac; 
    this.ip = ipAddress; 
    } 
    public void update() { 
    if (timerTask != null) timerTask.cancel(); 
    timer.schedule(timerTask(), 10 * 60 * 1000); 
    } 
    private TimerTask timerTask() { 
    return timerTask = new TimerTask() { 
     @Override public void run() { timerFinished(); } 
    }; 
    } 
    public void timerFinished() { 
    // tasks 
    } 
} 

請注意,我不重複構造函數內的調度。你應該初始化與

new KeepAliveTimer(mac, ip).update();