系统无法处理纳秒触发的事件,为什么?

时间:2014-12-03 12:37:29

标签: java timer timertask nanotime

我真的寻求有关以下内容的合理解释。我有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 个答案:

答案 0 :(得分:4)

我不确定我是否理解实际问题,并且接受的答案中给出的信息看起来是正确的。但对于方法Timer.schedule(TimerTask, long),long值是以毫秒为单位测量的延迟 。它不知道或关心长度是否原本是几纳秒。因为这是十亿分之一秒而不是千分之一,所以你要等待的时间要比毫秒级要长几个数量级。

答案 1 :(得分:3)

System.nanoTime()上的api文档说:

  

此方法提供纳秒精度,但不一定   纳秒分辨率(即,值的变化频率) - 否   除了分辨率至少与分辨率一样好之外,还要做出保证   currentTimeMillis()。

因此,JVM可能无法看到小于1毫秒的时间差异。