簡體   English   中英

Java Thread.sleep異常

[英]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文檔中:

  • millis-睡眠時間(以毫秒為單位)。
  • 毫微秒-額外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);
}

編輯:我的示例代碼將被視為“深夜代碼”,其中有錯誤;)。

只是一個猜測:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM