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