Java – повторное использование объекта Timer после вызова отмены

Вопрос:У меня есть приложение на Java, где мне нужно запланировать TimerTask, который будет выполнен после 500 мс, однако, если произойдет определенное событие, я должен reset таймер для этой задачи (чтобы мы должны были ждать еще 500 мс для его выполнения). У меня есть timer, объявленный для всего класса. Я использую следующий код: public static void

Вопрос:

У меня есть приложение на Java, где мне нужно запланировать TimerTask, который будет выполнен после 500 мс, однако, если произойдет определенное событие, я должен reset таймер для этой задачи (чтобы мы должны были ждать еще 500 мс для его выполнения). У меня есть 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.

Ответ №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();

Сделайте свой reset

if(condition) { timerr.reset(); } Ответ №2

Вы можете проверить таймер Java Swing. Он работает несколько иначе, и вам, возможно, придется написать внутренний класс или actionlistener, но таймер Swing включает в себя .stop() и .restart(), которые, похоже, будут работать лучше в вашем приложении.

Оцените статью
Добавить комментарий