Использует ли Thread.sleep () те же часы, что и System.nanoTime ()

1

Этот вопрос связан с отношением между библиотечными функциями, которые выполняют какое-то ожидание, например Thread.sleep(long), Object.wait(long), BlockingQueue.poll(long, TimeUnit) и значениями, возвращаемыми System.nanoTime() и System.currentTimeMillis().

Насколько я понимаю, есть по крайней мере два, в основном независимых часы, к которым приложение Java имеет доступ:

  • System.currentTimeMillis(), который в основном является Clock Clock Time, что также означает, что пользовательское и системное программное обеспечение, такое как демон NTP, может время от времени возиться с ним, что может привести к тому, что это значение скачет в любом направлении и количестве.
  • System.nanoTime() который гарантированно монотонно и более или менее стабильно возрастает, но может дрейфовать из-за так называемых так называемых тактовых частот процессора и артефактов, вызванных механизмами энергосбережения.

Теперь я понимаю, что функции библиотеки, такие как Thread.sleep() должны полагаться на некоторый зависящий от платформы интерфейс, чтобы приостановить поток до тех пор, пока указанное количество времени не пройдет, но можно ли предположить, что время, измеренное этими функциями, основано на значения System.nanoTime()?

Я знаю, что ни одна из этих функций не гарантирует более точное время измерения, чем несколько миллисекунд, но меня очень интересует очень долго (как в часах). Т.е. если я вызову Thread.sleep(10 * 3600 * 1000) время, измеренное между двумя часами, может отличаться на несколько минут, но я предполагаю, что один из них будет находиться в пределах доли секунды от запрошенных 10 часов. И если какой-либо из двух часов, я предполагаю, что он используется System.nanoTime(). Правильны ли эти предположения?

  • 1
    Не полагайтесь на очень долгое ожидание, вполне нормально, чтобы нить просыпалась каждую минуту или около того и проверяла время.
Теги:
time
blocking

2 ответа

2

Нет, небезопасно предположить, что Thread.sleep основан на System.nanoTime.

Java полагается на ОС для выполнения планирования потоков и не может контролировать, как работает ОС.

1

По большей части API на основе времени, существовавший до-jdk 1.5 (Timer, Thread.sleep, wait (long)), использует время на основе миллисекунд. Большинство вспомогательных ресурсов параллелизма, добавленных в jdk 1. 5+ (java.util.concurrent. *) Используют время на основе nano.

Тем не менее, я не думаю, что jvm гарантирует это поведение, поэтому вы, конечно, не должны зависеть от поведения так или иначе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню