【问题标题】:Is it possible to stop a Timer from a separate class?是否可以从单独的类中停止计时器?
【发布时间】:2019-07-26 03:41:25
【问题描述】:

我正在尝试重置 Timer 以避免出现多个实例。为此,我想从一个单独的类中停止 Timer,如下所示:

public void Timer() 
{
    Timer timer = new Timer(); 
    long interval = (1000) ;
    timer.schedule( new TimerTask() 
    {
        public void run() 
        {
            // code //       
        }
    }, 0, interval);         
}

public void Stop() 
{
    // stop Timer //
}

我觉得这可以通过终止 Timer(); 来实现。如果无法停止计时器,我将非常感谢向我展示如何最好地尽可能干净地终止课程。谢谢。

【问题讨论】:

  • 正如您目前拥有的那样,您将无法对计时器执行任何操作,因为它是 Timer 的本地函数,void 返回方法。
  • @ChiefTwoPencils 很抱歉,说到 OOP,我很绝望。我可以改变什么来完成这项工作?
  • 在这方面有很多选择,但都涉及从方法中取出计时器。一种方法是将其作为Timer()Stop() 的班级成员。
  • 您使用了 Swing 标签,这意味着您应该使用 Swing Timer,而不是 AWT Timer。见How to Use Swing Timers。 `我想从一个单独的类中停止 Timer` - Timer 与任何其他 Java 对象没有什么不同。如果要在另一个类中引用 Timer,则另一个类需要对 Timer 变量的引用。您如何做到这一点取决于您当前的设计。我们对此一无所知,因此无法给出具体建议。

标签: java swing class timer timertask


【解决方案1】:

Newtimer.java

public class NewTimer{
   public Timer timer;
   public long interval;

public NewTimer(){
   if(instance == null){
      timer = new Timer(); 
      interval = (1000); 
   }
}
public void start() 
{
    timer.schedule( new TimerTask() 
    {
        public void run() 
        {
            // code //       
        }
    }, 0, interval);         
}

public void Stop() 
{
    // stop Timer //
}

在其他类,你可以你这个对象类。

NewTimer newTimer = new NewTimer();

//Start timer
newTimer.start();

if(newTimer != null){
   //reinitialize
}

检查是否有 timer 类的实例。如果是这样,您可以重新初始化它。

【讨论】:

  • 我明白你的意思,但我不确定你想把这条线放在哪里。或者更确切地说,我不知道如何从 Timer 本身初始化 Timer。
  • 非常感谢您提供此代码;我了解您在这里所做的一切,除了 if(instance == null) 。如果你能提供一个简短的例子说明我应该在这里放什么样的东西,我将不胜感激。
  • 这一切都取决于你如何使用它。如果您初始化它并在同一功能上启动计时器,则不必这样做。您可以再次使用启动功能。另一方面,如果您将 NewTimer 作为全局变量,则需要检查 newtimer 是否已初始化。因为如果你不这样做,你可能会得到一个空异常。
【解决方案2】:

我设计了一个非常基本的解决方案:

boolean stop;
public void Timer() 
{
    Timer timer = new Timer(); 
    long interval = (1000) ;
    timer.schedule( new TimerTask() 
    {
        public void run() 
        {
            if condition is met{
                execute
            }
            else if(stop == true){
                timer.cancel();
            }       
        }
    }, 0, interval);         
}

.
.
.

stop = true;
try {
    Thread.sleep(2000);
} catch (InterruptedException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
stop = false;
Timer1();

基本上,布尔值会停止 Timer,给它 2 秒以确保没有重叠,然后设置回 false 以安全地重置 Timer。

【讨论】:

    最近更新 更多