Java - 在调用cancel

时间:2017-03-18 15:59:55

标签: java timer timertask

我有一个Java应用程序,我需要安排一个TimerTask,它将在500ms后执行,但如果发生某个事件,我必须重置此任务的计时器(这样我们必须等待另一个500ms为了它执行)。我为全班宣布了timer。我使用以下代码:

public static void main(String[] args) {

    if (curr_pck == my_pck) {
                timer.cancel();
                timer.purge();
                timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        myTask();
                    }
                }, 500);
            }

}  


public static void myTask() {

    timer.cancel();
    timer.purge();

    timer = new Timer();

    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            myTask();
        }
    }, 500);

  //EXECUTE CODE WHICH ISN'T RELEVANT TO THE QUESTION

}

我知道如果我使用timer.cancel()我无法重复使用计时器对象,但我认为在行timer = new Timer()中重新初始化它应该可以解决这个问题。有没有办法解决这个问题?

timer.schedule(new TimerTask() {函数内的myTask()行的例外:

java.lang.IllegalStateException: Timer already cancelled.

2 个答案:

答案 0 :(得分:-1)

使用适当的方法创建一个类Timerr。然后像访问普通计时器一样访问它。

public class Timerr
{
    private Timer timer;

    public Timerr()
    {
        timer = new Timer();
        start();
    }

    public void start()
    {
        timer.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                System.out.println("hi");
            }
        }, 500);
    }

    public void reset()
    {
        timer.cancel();
        timer.purge();
        start();
    }
}

创建实例

private Timerr timer = new Timerr();

重置

if(condition)
{
    timerr.reset();
}

答案 1 :(得分:-2)

您可能想要查看Java的Swing计时器。它的工作方式有所不同,您可能需要编写内部类或actionlistener,但Swing计时器包含.stop()和.restart(),看起来它们在您的应用程序中可以更好地工作。