我做了一個類,它控制我的程序運行的速度,類似於垂直同步,它在每幀處傳遞一些必要的信息給程序。我有整個工作的工作,但我已經嘗試使用更精確的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.5到2毫秒的誤差。它可以睡10秒或100秒,比你的建議更長。獲得準確延遲的最佳方法是在實時操作系統上使用實時Java。 – 2010-11-26 07:00:38