[英]Java Thread.sleep Exception
我制作了一個類來控制程序的運行速度,類似於垂直同步,它在每幀將一些必要的信息傳遞給程序。 我已經完成了所有工作,但是我嘗試使用更准確的Thread.sleep(long millis,int nanos),我沒有足夠的經驗。 根據我所看到的描述,它僅將提供的毫秒數添加到納秒數,然后暫停線程。 但是,大約90%的幀會拋出一個奇怪的異常,我確實無法破譯。
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();
}
}
速率是等於一幀長度(以納秒為單位)的變量,停止實際上並不重要,而且很明顯。 start / endTime是一幀開始和結束的時間。 deltaTime是幀完成所需的時間長度。 最后,deltaRemainder是幀應該花費的額外時間量(如果花費的時間比應該花費的時間長,它會跳到下一個可能的幀結束)。
誰能解釋為什么拋出此異常? 我真的更喜歡使用此功能提供的准確性。
您的deltaRemainder似乎超出了0到999999之間的允許范圍。
從Thread.sleep文檔中:
因此,您應該檢查它是否大於999999,如果是,則將大於999999的值放入毫秒中,例如
int milliseconds = 0;
if ( deltaRemainder > 999999 ) {
milliseconds = deltaRemainder / 1000000;
deltaRemainder = deltaRemainder % 1000000;
}
if ( milliseocnds > 0 || deltaRemainder > 0) {
Thread.sleep(milliseconds, deltaRemainder);
}
編輯:我的示例代碼將被視為“深夜代碼”,其中有錯誤;)。
只是一個猜測:
int有32位,因此int從-2 ^ 31到2 ^ 31-1如果deltaRemainder太大,則可能會溢出,並且結果int將為負數。 您的deltaRemainder可以超過2 ^ 31嗎? (2GB約為2.000.000.000,即:2秒?)
其他猜測是:
deltaRemainder是> 0但<1。因此int'ed值為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.