Преобразование наносекунд в миллисекунды и наносекунды ‹999999 в Java

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

Изменить: теперь мой код выглядит следующим образом:

while (hasNS3Events()) {                                
    long delayNS = getNS3EventTSDelay();
    long delayMS = 0;
    if (delayNS <= 0) runOneNS3Event();
    else {
        try {
            if (delayNS > 999999) {
                delayMS = delayNS / 1000000;
                delayNS = delayNS % 1000000;
            }

            EVTLOCK.wait(delayMS, (int)delayNS);
        } catch (InterruptedException e) {

        }
    }
}

Привет, Крис


person Chris Dennett    schedule 29.11.2010    source источник
comment
Стоит отметить, что этот раз - это намек ОС подождать хотя бы так долго. В Windows и Linux задержка обычно не превышает 2 мс, но может быть очень большой. IMHO Вы не должны беспокоиться о времени наносекунды, так как вы вряд ли заметите какую-либо разницу.   -  person Peter Lawrey    schedule 29.11.2010


Ответы (4)


Просто возьмите его divmod с 1000000.

person Ignacio Vazquez-Abrams    schedule 29.11.2010
comment
Не могли бы вы проверить правильность вставленного кода? Приветствия: D Одна вещь, от которой я устал, - это верхний предел 999999 вместо 1000000 (так говорится в Javadoc). Могло ли это вызвать проблемы? - person Chris Dennett; 29.11.2010
comment
Математика верна. Чек не является обязательным и пахнет волшебным числом. - person Ignacio Vazquez-Abrams; 29.11.2010
comment
Целочисленный модуль n всегда будет давать остаток с верхним пределом n - 1. - person Ignacio Vazquez-Abrams; 29.11.2010

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

  long durationInMs = TimeUnit.MILLISECONDS.convert(delayNS, TimeUnit.NANOSECONDS);
person Shawn Vader    schedule 06.02.2014
comment
Этот метод усекает до 0, если, например, использовалось 999999 наносекунд. - person Gilian; 29.04.2016
comment
Это не работает и тоже не отвечает на вопрос. Вопрос состоял в том, чтобы преобразовать в миллис И нано, что вам нужно, например, для вызова Thread.sleep (миллис, нано). - person Christian Esken; 06.03.2017

Для еще более короткого преобразования с использованием java.util.concurrent.TimeUnit, эквивалентного тому, что Шон написал выше, вы можете использовать:

    long durationInMs = TimeUnit.NANOSECONDS.toMillis(delayNS);
person Ibrahim Arief    schedule 24.11.2014
comment
Как уже упоминалось, это обрезает результат. Итак, 3,9999 будет 3 - person Yeikel; 06.03.2019

TimeUnit.timedWait (Object obj, long timeout) - это то, что вам следует использовать. Он выполняет этот расчет за вас, а затем вызывает объект wait.

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#timedWait(java.lang.Object,%20long)

Реализация из Java 8 (чтобы увидеть, что она вычисляет мс и нс на основе наносекунд):

public void timedWait(Object obj, long timeout)
        throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        obj.wait(ms, ns);
    }
}

Итак, вы бы использовали

TimeUnit.NANOSECONDS.timedWait(EVTLOCK, delayNS);

Есть также похожие методы sleep и timedJoin.

person Randall T.    schedule 30.06.2020