2013-03-27 2 views
1

Я планирую поток для ежедневного запуска с использованием TimerTask. Вот код.Необычная задержка при планировании с помощью TimerTask в java

private void scheduleDailyProcess() { 
    Calendar c = Calendar.getInstance(); 
    c.add(Calendar.DATE, 1); 
    c.set(Calendar.HOUR_OF_DAY, 0); 
    c.set(Calendar.MINUTE, 5); 
    c.set(Calendar.SECOND, 0); 
    c.set(Calendar.MILLISECOND, 0); 

    Timer timer = new Timer(); 

    int period = 24 * 60 * 60 * 1000; //24 hours 
    timer.schedule(new DailyProcess(), c.getTime(), period); 
} 

Я хочу, чтобы поток работал в 00:05 ежедневно. Однако я заметил, что поток начинается с неопределенной задержки в 8 секунд.

Я что-то пропустил в коде? Или есть проблема с TimerTask?

В пределах DailyProcess нет задержки.

+0

Откуда вы получаете свою дельту? У вас есть временные распечатки в вашей программе? – Max

+0

Да, я вижу задержку в 8 секунд из моих журналов. –

+0

'TimerTask' не гарантирует точное время выполнения. Фактически, документация в нем довольно подробно. Если вам нужна точность, я предлагаю использовать рамки Quartz -> http://quartz-scheduler.org/. –

ответ

1

Возможно, что перед этой задачей выполняется что-то еще, задерживающее первоначальное выполнение DailyProcess.

Согласно документации TimerTask:

, соответствующая каждому объект Timer является одной фоновым потоком, который используется для выполнения всех заданий таймера, последовательно. Задачи таймера должны выполняться быстро. Если задача таймера занимает слишком много времени для завершения, она «запускает» поток выполнения задачи таймера. Это может, в свою очередь, задерживать выполнение последующих задач, которые могут «сгруппироваться» и выполняться быстро, когда (и если) завершающая задача окончательно завершается.

+0

DailyProcess - это единственный поток, который выполняется этим объектом таймера. Никакой другой TimerTask не существует до или после. –

+0

Внимательно прочитайте документацию по TimerTask. Хотя система пытается запустить задачу в назначенное время, нет никаких гарантий, что она будет работать точно, когда вы укажете, и есть несколько факторов, которые могут вызвать некоторый дрейф. Если 8-секундное смещение в ежедневной задаче неприемлемо для вашей задачи, вы, вероятно, не можете полагаться на TimerTask. – JohnnyO

+0

Задержка в 8 секунд приемлема для меня. Спасибо за разъяснения. –

Смежные вопросы