2010-11-26 83 views
1

我做了一個類,它控制我的程序運行的速度,類似於垂直同步,它在每幀處傳遞一些必要的信息給程序。我有整個工作的工作,但我已經嘗試使用更精確的Thread.sleep(long millis,int nanos),這是我很不習慣使用的東西。根據我所看到的描述,它只是增加提供給納秒的毫秒數,然後暫停線程。但是,大約90%的框架拋出了一個奇怪的例外,我真的無法破譯。Java Thread.sleep異常

java.lang.IllegalArgumentException: nanosecond timeout value out of range 

以下是我使用的大部分代碼,它以任何方式與我用於延遲線程的變量進行交互。

long startTime = System.nanoTime(); 
while (! this.stop) 
{ 
    try 
    { 
     // Run Frame 

     long endTime, deltaTime, deltaRemainder; 
     endTime = System.nanoTime(); 
     deltaTime = endTime - startTime; 

     deltaRemainder = this.rate - (deltaTime % this.rate); 
     System.out.println("Frame Completed with " 
       + (double)(deltaRemainder * .000000001) + " seconds left!"); 
     if (deltaRemainder > 0) 
      Thread.sleep(0, (int)(deltaRemainder)); 

     startTime = System.nanoTime(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

rate是等於幀的長度的變量,單位爲納秒,stop是非常不重要的,並且是明顯的。開始/結束時間是一幀開始和結束的時間。 deltaTime是幀完成時間的長度。最後,deltaRemainder是幀完成所花費的額外時間(如果花費的時間超過了它應該的時間,它會跳到下一個可能的幀結束)。

任何人都可以解釋爲什麼會引發此異常嗎?我真的更喜歡使用此功能提供的準確性。

+0

睡覺時間只是睡眠時間的一個暗示,值得一提。我發現你在這個時間上看到0.5到2毫秒的誤差。它可以睡10秒或100秒,比你的建議更長。獲得準確延遲的最佳方法是在實時操作系統上使用實時Java。 – 2010-11-26 07:00:38

回答

7

它看來你的deltaRemainder是允許的範圍之外介於0和999999

從了Thread.sleep文檔:

  • 米利斯 - 時間以毫秒爲單位的休眠時間。
  • nanos - 0-999999額外納秒睡覺。

因此,您應該檢查它是否大於999999,如果是,請將大於999999的值轉換爲毫秒,例如,

int milliseconds = 0; 
if (deltaRemainder > 999999) { 
    milliseconds = deltaRemainder/1000000; 
    deltaRemainder = deltaRemainder % 1000000; 
} 

if (milliseocnds > 0 || deltaRemainder > 0) { 
    Thread.sleep(milliseconds, deltaRemainder); 
} 

編輯:我的示例代碼被視爲「深夜代碼」,它有錯誤;)。

+0

+1;毫微秒添加到毫秒,並且不能超過毫秒值:http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#sleep%28long,%20int%29 – 2010-11-26 00:26:32

0

只是一種猜測:

整數有32位這樣去整數從-2^31到2^31-1 如果deltaRemainder是太大,它就會溢出,所得INT將是負面的。 您的deltaRemainder可以超過2^31嗎? (2GB其是aprox的2.000.000.000,它是:2秒?)

其他的猜測是:

deltaRemainder是> 0但< 1.所以int'ed值爲0

+0

它不應該超過2秒,因爲那意味着該程序將超過請求長度的60倍來運行單個幀。我還試圖檢查一次類型轉換後是否小於1,這不是問題。所以,我仍然無能爲力。 – B3tturTh3nU 2010-11-26 00:25:33