Мой ответ - не использовать Timer
, он устарел. Начиная с Java5, Timer
был заменен на ScheduledExecutorService
, который стал гораздо более гибким и простым в использовании. Вы получаете более точный контроль над тем, как работает планировщик, такого рода контроль, который вы не получаете с Timer
.
Вы создаете класс с использованием фабричного класса Executors , который имеет несколько фабричных методов. Вы должны посмотреть на newSingleThreadScheduledExecutor , который должен делать именно то, что вы ищете:
Создает однопоточный исполнитель
которые могут планировать команды для запуска
после заданной задержки или выполнить
периодически. Задачи гарантированы
выполнять последовательно и не более
одна задача будет активна в любой момент
время.
Используя ScheduledExecutorService
вместо подкласса TimerTask
, вы напрямую создаете подкласс Runnable
, а затем отправляете задачу исполнителю. У исполнителя есть различные методы, вам нужно выбрать, какой из них подходит для ваших нужд (внимательно прочитайте javadoc для ScheduledExecutorService
), но суть примерно такая:
// initialise the executor
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
while (tasksRemaining) {
// create your task
Runnable task = ....;
// submit it to the executor, using one of the various scheduleXYZ methods
executor.schedule(task, delay, unit);
}
// when everything is finished, shutdown the executor
executor.shutdown();
Как всегда, прочитайте Javadoc.