2016-06-01 12 views
1

私はこのコードを持っています。これは基本的に私のアプリケーション用のカスタムタイマーを提供します。このクラスのisTimerRunning()の実装方法

import java.util.Timer; 
import java.util.TimerTask; 

import org.apache.log4j.Logger; 


public class SMSFirewallTimer { 
    private static Logger logger = Logger.getLogger(SMSFirewallTimer.class); 
    Timer timer; 
    String timerId; 

    public SMSFirewallTimer(int seconds, String string) { 
     timer = new Timer(); 
     timerId = string; 
     logger.debug("SMSFirewallTimer: timer started for: "+seconds +"seconds"); 
     timer.schedule(new Timeout(string), seconds*1000); 
    } 

    public void cancelTimer() 
    { 
     this.timer.cancel(); 
     logger.debug("SMSFirewallTimer: Cancelling timer for : " + this.timerId); 
    } 

    class Timeout extends TimerTask { 
     private String string; 
     public Timeout(String string) { 
      this.string = string; 

     } 
     @Override 
     public void run() { 
      logger.debug("SMSFirewallTimer: Time's up! for: " + this.string); 
      timer.cancel(); //Terminate the timer thread    
     } 
    } 
} 

今の問題は、私はタイマーがまだ実行されているかどうかということを私に教えてくれますし、それはまた、心の中でタイムアウトを維持する必要がありSMSFirewallTimerisRunning()方法が欲しいという問題が生じます。

私はちょうど私たちがcancelTimer()を使用している場合、それは良いだけ保持しているこのクラスのisTimerとしてブール値を宣言し、それは文句を言わないその別の予定方式new Timeout(string)として、タイマーの期限が切れているかどうかを知るようになっている場合。

答えて

1

は、SMSFirewallTimerの各インスタンスがSMSFirewallTimerの特定のインスタンスに関連付けられ、そのフィールドとメソッドにアクセスできることを意味するSMSFirewallTimerの内部クラスです。

置き換えるのに十分であるべきである:

 timer.cancel(); //Terminate the timer thread    

Timeoutrun方法で

 cancelTimer(); //Terminate the timer thread    

で。

1

はあなたSMSFirewallTimer isRunningフィールドに自分のタイムアウトからのアクセスを持ってしたくない場合は、この

import java.util.Timer; 
import java.util.TimerTask; 

import org.apache.log4j.Logger; 


public class SMSFirewallTimer { 
    private static Logger logger = Logger.getLogger(SMSFirewallTimer.class); 
    Timer timer; 
    String timerId; 
    private Boolean isRunning; 


    public SMSFirewallTimer(int seconds, String string) { 
     timer = new Timer(); 
     timerId = string; 
     logger.debug("SMSFirewallTimer: timer started for: "+seconds +"seconds"); 
     isRunning = true; 
     timer.schedule(new Timeout(string), seconds*1000); 
    } 

    public void cancelTimer() 
    { 
     isRunning = false; 
     this.timer.cancel(); 
     logger.debug("SMSFirewallTimer: Cancelling timer for : " + this.timerId); 
    } 

    public boolean isRunning() { 
     return isRunning; 
    } 


    class Timeout extends TimerTask { 
     private String string; 
     public Timeout(String string) { 
      this.string = string; 

     } 
     @Override 
     public void run() { 
      logger.debug("SMSFirewallTimer: Time's up! for: " + this.string); 
      isRunning = false; 
      timer.cancel(); //Terminate the timer thread    
     } 
    } 
} 

はまた、あなたがタイムアウトのための参照を保持することができます試してみてください。

+0

これは問題なく動作します。 – piyushj

関連する問題