在不使用Thread.sleep()的情况下等待一些事情?

时间:2013-06-30 20:32:16

标签: java swing

我正在尝试使用一些字符串来介绍游戏,我想让其他人等待另一个字符串弹出,我不直接想要使用Thread.sleep()让它等待,因为我是不确定这是否是最好的选择。有没有其他方法可以让某些东西等待而不是让线程休眠,或者我只是让线程睡眠?

4 个答案:

答案 0 :(得分:5)

如果这是游戏,你不应该使用睡眠或计时器。

通常游戏都有自己的内部时钟机制。这意味着您将尝试尽可能快地渲染帧。将使用当前游戏时间调用OnRender方法。您可以使用它来确定是否有足够的时间转到下一个屏幕。

这意味着您将在第1帧中获得时间点A.您将在第2帧中获得Delta或其他时间点B.您可以通过使用增量或计算增量来确定已经过了多少时间。三角洲自己。对于计时情况,这是一种非常有效的机制,并且当游戏是单线程时效果很好。任何程序的想法都是永远不会阻止任何事情。

通常阻塞的原因是I / O,例如从磁盘读取,网络或将数据放在GPU上。在你的情况下,你可以不受阻碍地完成所有事情。

这是https://gamedev.stackexchange.com/questions/1589/fixed-time-step-vs-variable-time-step

上的一个不错的页面

答案 1 :(得分:3)

这有一个标准机制:Object.wait()Object.notify()(带有重载/变体)。你只是等待一个事件发生在一个线程中,而另一个线程则负责通知你(或notifyAll的所有人)。

您还可以使用java.util.concurrent中引入的新Condition机制。

答案 2 :(得分:0)

long t1=0,t2=0;
long nanoWaitTime=10000; //to wait at least 10000 nano-seconds
t1=System.nanoTime();
//start waiting
long count=0;
boolean releaseCpuResources=true;
while(Math.abs(t2-t1)<nanoWaitTime)
{
   t2=System.nanoTime(); //needs maybe 1000 cycles of cpu to get this value.
                         //so this is like busy-wait
                         //and minimum step may be 1 micro-seconds or more
   if(releaseCpuResources)
   {
   count++;
   if(count>1000)Thread.sleep(1);//after too many iterations, cpu gets overwhelmed
                                 //so Thread.sleep makes it better for large waiting
                                 //times
                                 //but precision is lost. Like uncertainity principle
                                 //but in a quantized fashion
   }
}
// here continue to work after waiting

分辨率或精度可能不是您想要的所有cpu。

答案 3 :(得分:0)

如果你在游戏中制作它,为什么不尝试在libgdx中使用像Actions这样的东西?你只是把不同的演员连在一起。每当可见性或位置等属性达到您想要的值时,您都会触发下一个操作。在游戏的每个更新循环期间检查属性条件。

或者如果它是一个摇摆应用程序,请使用计时器来检查这些属性。