Я написал демон, который был структурирован следующим образом:
while( true ) {
// do some stuff
Thread.sleep( 1000 );
}
Я заметил, что он использует очень большое количество процессора - до 100%.У меня в течение нескольких месяцев был аналогичный демон на моих производственных серверах с той же самой проблемой с процессором.
Вчера я реорганизовал код для использования TimerTask .Сразу же я заметил, что загрузка процессора снизилась на моем устройстве разработки.Поэтому я решил развернуть в производство и перепроверить с помощью Munin.Вот графики:
Пара моментов:
- Больше ничего не работаетрабочий сервер, кроме JVM.
- Нет других запущенных потоков приложений
- Он определенно выполнял код старого стиля с правильными периодическими интервалами - я всегда записываю в журнал каждый раз, когдапоток выполняется.
Итак: почему Thread.sleep неэффективен по сравнению с TimerTask?