Система не может обрабатывать события, происходящие на наносекундах, почему?

Я действительно ищу логическое объяснение относительно следующего. у меня есть timed task

static TimerTask timedTask = new TimerTask() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("timed task");
    }
};

Timer timer = new Timer();
timer.schedule(timedTask, (long) logfile.getFileHash().get(1).getTimeStampInNano());

когда я запускаю этот код, в консоли ничего не появляется, но я меняю его на:

Timer timer = new Timer();
timer.schedule(timedTask, (long) logfile.getFileHash().get(1).getTimeStampInMilli());

консоль отображает сообщение в run() метод. Мне кажется, что системе не удалось обработать время в наносекундах, потому что они быстрее системных часов. Но как это возможно, пока есть метод System.nanoTime()Это означает, что система должна быть в состоянии распознать, что задача запускается в определенные наносекунды.

2 ответа

Решение

В документации API для System.nanoTime() говорится:

Этот метод обеспечивает наносекундную точность, но не обязательно наносекундное разрешение (то есть как часто изменяется значение) - никаких гарантий не дается, за исключением того, что разрешение, по крайней мере, такое же, как у currentTimeMillis().

Таким образом, JVM может не увидеть разницу во времени, которая меньше 1 миллисекунды.

Я не уверен, что понимаю настоящий вопрос, и информация, представленная в принятом ответе, выглядит правильной. Но для метода Timer.schedule(TimerTask, long)длинное значение - это задержка, измеряемая в миллисекундах. Он не знает или не заботится о том, был ли длинный первоначально ряд наносекунд. Поскольку это миллиардные доли секунды вместо тысячных, вы будете ждать на много порядков дольше, чем если бы это было в миллисекундах.

Другие вопросы по тегам