Java Object.wait (long, long) Реализация отличается от документации

1

Метод 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?

Теги:
wait
jvm

2 ответа

2
Лучший ответ

Возможно, что это всего лишь реализация по умолчанию, и JVM реализует ее специфично для платформы при создании оптимизированного кода через свои JIT-компиляторы.

Подобные вещи случаются с - например, методами Math. {Min, max, abs}, они реализуются в java, но заменяются оптимизированной сборкой компиляторами.

Как отметил @Nitram, окна предоставляют только миллисекундное планирование/ожидание потоков на уровне ОС. И даже измерение (даже не ожидая) при наносекундной точности довольно проблематично под окнами. Т.е. лучшие реализации не могут быть реализацией по умолчанию, потому что они доступны только на некоторых платформах.

0

Насколько мне известно, даже высокоточные таймеры в Windows дают вам разрешение до миллисекунды (страница MSDN). И поскольку Java внутренне должен использовать некоторую реализацию таймера для обработки ожидающей операции, я думаю, что это ограничивающий фактор.

  • 0
    Тогда какой смысл иметь метод wait(long, long) любом случае? Для меня было бы более разумно либо удалить его, либо, более разумно, сделать его native и скрыть фактическую реализацию.
  • 1
    Я думаю, что это более точное время можно сделать. Я помню, как читал где-то, что в Linux вы получаете разрешение ниже миллисекунды, но я не знаю, насколько надежны тайминги на этом уровне на потребительском компьютере. Так что либо эта функция wait(long, long) существует по историческим причинам, потому что кто-то посчитал это хорошей идеей, либо существуют специальные реализации Java, которые имеют отличную реализацию, которая обеспечивает лучшее разрешение.

Ещё вопросы

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