我真的寻求有关以下内容的合理解释。我有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()
的方法,它是如何实现的,这意味着系统应该能够识别任务在特定纳秒时开始。
答案 0 :(得分:4)
我不确定我是否理解实际问题,并且接受的答案中给出的信息看起来是正确的。但对于方法Timer.schedule(TimerTask, long)
,long值是以毫秒为单位测量的延迟 。它不知道或关心长度是否原本是几纳秒。因为这是十亿分之一秒而不是千分之一,所以你要等待的时间要比毫秒级要长几个数量级。
答案 1 :(得分:3)
System.nanoTime()上的api文档说:
此方法提供纳秒精度,但不一定 纳秒分辨率(即,值的变化频率) - 否 除了分辨率至少与分辨率一样好之外,还要做出保证 currentTimeMillis()。
因此,JVM可能无法看到小于1毫秒的时间差异。