我有这段代码,它基本上为我的应用程序提供了一个自定义计时器。
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
}
}
}
现在出现了问题,我想要在
isRunning()
中使用SMSFirewallTimer
方法,该方法将告诉我计时器是否仍在运行,并且还应牢记超时。如果我仅在此类中将布尔值声明为
isTimer
,则仅当我们使用cancelTimer()
时才有效,但它不会知道timer是否已过期,因为它是另一个计划的方法new Timeout(string)
。 最佳答案
Timeout
是SMSFirewallTimer
的内部类,这意味着SMSFirewallTimer
的每个实例都绑定到SMSFirewallTimer
的特定实例,并且可以访问其字段和方法。
足以替换:
timer.cancel(); //Terminate the timer thread
与
cancelTimer(); //Terminate the timer thread
在
run
的Timeout
方法中。