Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.sleep异常_Java_Multithreading_Exception_Sleep - Fatal编程技术网

Java Thread.sleep异常

Java Thread.sleep异常,java,multithreading,exception,sleep,Java,Multithreading,Exception,Sleep,我创建了一个类来控制程序运行的速度,有点像垂直同步,它在每一帧向程序传递一些必要的信息。我已经完成了整个工作,但是我已经尝试过使用更精确的Thread.sleep(长毫秒,整数纳米),这是我使用起来相当缺乏经验的东西。根据我看到的描述,它只是将提供的毫秒添加到纳秒,然后暂停线程。但是,大约90%的帧抛出一个奇怪的异常,我真的无法破译 java.lang.IllegalArgumentException: nanosecond timeout value out of range 下面是我使用的

我创建了一个类来控制程序运行的速度,有点像垂直同步,它在每一帧向程序传递一些必要的信息。我已经完成了整个工作,但是我已经尝试过使用更精确的Thread.sleep(长毫秒,整数纳米),这是我使用起来相当缺乏经验的东西。根据我看到的描述,它只是将提供的毫秒添加到纳秒,然后暂停线程。但是,大约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();
    }
}
速率是一个变量,它等于一帧的长度(以纳秒为单位),停止真的不重要,而且很明显。开始/结束时间是帧开始和结束时的时间。deltaTime是帧完成所需的时间长度。最后,DeltareMinder是帧完成所需的额外时间量(如果所需时间超过应有时间,则跳到下一个可能的帧结束)

有人能解释为什么会抛出此异常吗?我更愿意使用此函数提供的精度。

仅作猜测:

整数有32位,所以整数从-2^31变为2^31-1 如果DeltareMinder太大,它可能会溢出,结果int将为负。 你的三角帆能超过2^31吗?(2GB大约是2.000.000.000,它是:2秒?)

另一种猜测是:

DeltareMinder大于0但小于1。因此,积分值为0。

只是一个猜测:

整数有32位,所以整数从-2^31变为2^31-1 如果DeltareMinder太大,它可能会溢出,结果int将为负。 你的三角帆能超过2^31吗?(2GB大约是2.000.000.000,它是:2秒?)

另一种猜测是:


DeltareMinder大于0但小于1。因此int'ed值为0。

您的DeltareMinder似乎超出了0到999999之间允许的范围

从Thread.sleep文档:

  • 毫秒-以毫秒为单位的睡眠时间长度
  • 纳秒-0-999999额外纳秒睡眠
因此,您应该检查它是否大于999999,如果大于999999,则将大于999999的值以毫秒为单位,例如

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

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

编辑:我的示例代码将被视为“深夜代码”,其中有bug;)

您的DeltareMinder似乎超出了0到999999之间的允许范围

从Thread.sleep文档:

  • 毫秒-以毫秒为单位的睡眠时间长度
  • 纳秒-0-999999额外纳秒睡眠
因此,您应该检查它是否大于999999,如果大于999999,则将大于999999的值以毫秒为单位,例如

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

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

编辑:我的示例代码将被视为“深夜代码”,其中有bug;)

它不应该超过2秒,因为这意味着程序运行单个帧所需的时间超过了请求长度的60倍。我还尝试检查在类型转换后是否小于1,这不是问题。所以,我还是不知道。它不应该超过2秒,因为这意味着程序运行单个帧所需的时间超过了请求长度的60倍。我还尝试检查在类型转换后是否小于1,这不是问题。所以,我还是不知道;毫微秒被添加到毫秒,并且不能超过毫秒值:+1;毫微秒加在毫秒上,不能超过毫秒值:睡眠时间仅仅是睡眠时间最短的提示,这是毫无价值的。我发现,在这个计时上,您往往会看到0.5到2毫秒的错误。它可以比你建议的睡眠时间长10秒或100秒。获得准确延迟的最佳方法是在实时操作系统上使用实时java。睡眠时间只是关于最短睡眠时间的提示,这一点毫无价值。我发现,在这个计时上,您往往会看到0.5到2毫秒的错误。它可以比你建议的睡眠时间长10秒或100秒。获得准确延迟的最佳方法是在实时操作系统上使用实时java。