2014-12-03 30 views
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(),這意味着系統應該能夠識別某個任務從特定納秒開始。

回答

3

System.nanoTime() API文檔說:

此方法提供納秒的精度,但不一定 納秒級分辨率(即頻率變化值) - 沒有 保證,不同的是,這項決議是由至少與currentTimeMillis()的 一樣好。

因此,JVM可能無法看到小於1毫秒的時間差異。

+0

這並沒有回答這個問題,即將函數預期的毫秒數納秒作爲參數。 – vinntec 2016-04-03 18:18:01

4

我不確定我是否理解實際問題,並且接受答案中給出的信息看起來是正確的。但是對於方法Timer.schedule(TimerTask, long),長整數值是以毫秒爲單位測量的延遲。它不知道或關心這個long是否最初是幾納秒。因爲那是十億分之一秒而不是千分之一,所以你會比以毫秒爲單位等待更長的數量級。

+0

我認爲你解決了這個問題;由於涉及納米時間的(數量)較多,所以OP的等待時間不夠長... – 2014-12-03 14:25:36

+1

關於它的事情是,即使是一個毫秒級的數值​​代表一個日期也會造成比任何人更長的時間延遲等待。但我不知道這是多長的代表,我從方法名稱的「getTimeStamp」部分推斷出來。 – arcy 2014-12-03 14:32:59

+0

現在我再次查看原始問題(是否有人編輯它的內容),OP期待任務在特定時間開始。因此,有人應該告訴他不要把自己的價值「長」,它需要是一個「日期」。 – arcy 2014-12-03 22:01:01

相關問題