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