Какова цель сна (длинный миллис, int nanos)? - PullRequest
26 голосов
/ 02 июля 2011

В JDK это реализовано как:

public static void sleep(long millis, int nanos) 
throws InterruptedException {
if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
}

if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
            "nanosecond timeout value out of range");
}

if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
    millis++;
}

sleep(millis);
}

, что означает, что аргумент nanos вообще ничего не делает.

Есть ли в этом идея, что на оборудовании с более точной синхронизацией JVM для него может обеспечить лучшую реализацию для него?

Ответы [ 3 ]

14 голосов
/ 02 июля 2011

Обычная ОС не имеет достаточно мелкозернистого разрешения, чтобы засыпать на наносекунды за раз.Однако существуют операционные системы реального времени , в которых планирование события, которое должно происходить в определенный момент времени, является критическим, а задержки для многих операций ОЧЕНЬ низки.Система ABS является одним из примеров ОСРВ.Сон на наносекунду гораздо более полезен в таких системах, чем на обычных ОС, где ОС не может надежно спать в течение любого периода менее 15 мс.

Однако, наличие двух отдельных JDK не является решением.Следовательно, в Windows и Linux JVM сделает лучшую попытку спать в течение x наносекунд.

7 голосов
/ 02 июля 2011

Это выглядит как перспективное дополнение, потому что, когда у всех нас есть ноутбуки с петафлопом, и мы обычно указываем задержки в наносекундах. Между тем, если вы укажете задержку в наносекунду, вы получите задержку в миллисекунду.

Когда аппаратное обеспечение улучшается, а JVM следует, приложение переписывать не нужно.

0 голосов
/ 02 июля 2011

Проблема с проверкой на будущее связана с обратной совместимостью.Этот метод работал так долго, что если вы хотите задержку менее микросекунды, вам придется использовать разные методы.

Для сравнения,

 Object.wait(millis, nano);
...