Система не может обрабатывать события, происходящие на наносекундах, почему?
Я действительно ищу логическое объяснение относительно следующего. у меня есть 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)
длинное значение - это задержка, измеряемая в миллисекундах. Он не знает или не заботится о том, был ли длинный первоначально ряд наносекунд. Поскольку это миллиардные доли секунды вместо тысячных, вы будете ждать на много порядков дольше, чем если бы это было в миллисекундах.