1

我真的寻求关于以下内容的合乎逻辑的解释。我有一个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(),这意味着系统应该能够识别任务在特定的纳秒开始。

4

2 回答 2

4

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

于 2014-12-03T13:22:10.110 回答
3

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

此方法提供纳秒精度,但不一定提供纳秒分辨率(即值更改的频率) - 不保证分辨率至少与 currentTimeMillis() 的分辨率一样好。

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

于 2014-12-03T12:40:57.127 回答