繁体   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