Задача таймера в java?

Мне нужно выполнить таймер в java. Сценарий таков: я должен изначально запланировать задачу с некоторой задержкой. Если я нажал кнопку, текущий таймер отменяется, а затем переназначается. Как это реализовать в java?

когда я использовал cancel(), я не могу снова получить доступ к таймеру. то есть я не могу повторно использовать этот объект. я объявил Timer и Timertask статическими.

Заранее спасибо.


person Praveen    schedule 08.12.2010    source источник


Ответы (3)


Самый простой способ, который я могу придумать, это использовать Исполнитель.

Допустим, вы хотите запланировать запуск задачи через 30 секунд:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(new Task(), 30, TimeUnit.SECONDS);

Task должен быть классом, реализующим Runnable интерфейс:

class Task implements Runnable
{
    public void run()
    {
        // do your magic here
    }
}

Если вам нужно остановить выполнение вашей задачи, вы можете использовать метод shutdownNow:

// prevents task from executing if it hasn't executed yet
scheduler.shutdownNow(); 
person Pablo Santa Cruz    schedule 08.12.2010
comment
если я планирую новую задачу, то предыдущий планировщик останавливает/убивает свой процесс?? - person Praveen; 08.12.2010
comment
Это зависит от того, как вы его используете. - person Pablo Santa Cruz; 08.12.2010
comment
как это сделать? когда я выключаю объект планировщика. я не могу запланировать другую задачу для того же объекта? - person Praveen; 08.12.2010
comment
scheduler.schedule() возвращает объект Future, все, что вам нужно сделать, это запомнить Future и использовать его метод cancel() для удаления одной задачи из Executor, после чего вы можете запланировать новую задачу. Вам не нужно каждый раз создавать новый Executor. Просто отмените старую задачу и запланируйте новую задачу при нажатии кнопки. - person Reboot; 08.12.2010

Пока они не объявлены как final, просто создайте новые экземпляры.

person codelark    schedule 08.12.2010
comment
я не объявляю его окончательным. просто объявлен как статический. - person Praveen; 08.12.2010

Для этой цели также существует Quartz API. Это дало бы вам больше гибкости в кластерной среде.

person Vinay Lodha    schedule 08.12.2010