Метод Object#wait(long, long)
в java.lang.Object
указывает в нем документацию, которая
Этот метод аналогичен методу
wait
одного аргумента, но он позволяет более точно контролировать количество времени, чтобы ждать уведомления, прежде чем сдаваться. Количество реального времени, измеренное в наносекундах, определяется:1000000*timeout+nanos
Это само по себе имеет смысл, но реализация не отражает документацию:
public final void wait(long timeout, int nanos) throws InterruptedException
{
// ... Some range checks
if (nanos >= 500000 || (nanos != 0 && timeout == 0))
{
timeout++;
}
wait(timeout);
}
Как вы можете видеть, вместо фактического использования параметра nanos
он просто округляет его до миллисекунды и добавляет его к параметру timeout
, который затем используется для вызова менее точного метода wait(long)
.
Почему реализация wait(long, long)
отличается от нее документацией? Является ли это внутренним методом, который специально обрабатывается JVM?
Возможно, что это всего лишь реализация по умолчанию, и JVM реализует ее специфично для платформы при создании оптимизированного кода через свои JIT-компиляторы.
Подобные вещи случаются с - например, методами Math. {Min, max, abs}, они реализуются в java, но заменяются оптимизированной сборкой компиляторами.
Как отметил @Nitram, окна предоставляют только миллисекундное планирование/ожидание потоков на уровне ОС. И даже измерение (даже не ожидая) при наносекундной точности довольно проблематично под окнами. Т.е. лучшие реализации не могут быть реализацией по умолчанию, потому что они доступны только на некоторых платформах.
Насколько мне известно, даже высокоточные таймеры в Windows дают вам разрешение до миллисекунды (страница MSDN). И поскольку Java внутренне должен использовать некоторую реализацию таймера для обработки ожидающей операции, я думаю, что это ограничивающий фактор.
wait(long, long)
любом случае? Для меня было бы более разумно либо удалить его, либо, более разумно, сделать егоnative
и скрыть фактическую реализацию.wait(long, long)
существует по историческим причинам, потому что кто-то посчитал это хорошей идеей, либо существуют специальные реализации Java, которые имеют отличную реализацию, которая обеспечивает лучшее разрешение.