问题:Thread .Sleep(500)后你的线程睡了多久?

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

我们在J2ME中继承Canvas类的时候一般会再实现Runnable接口,实现多线程的效果个人认为实际上这边的线程不过是起到一个定时器的作用,完全可以用一个Timer或者用一个Inner class来实现这个的功能,在这里不对这个做过多的讨论。

我们的run()这个函数一般是实现这样的功能,定时的处理游戏逻辑gameLogic()和重画屏幕paint()。注意这里的定时是本文的重点,如果执行游戏逻辑和重画屏幕的间隔时间不为固定的话。一定破坏游戏性和游戏画面的真实性。

好了,我们看看一般的处理方法()

public void run() {

while (true) {

gameLogic();//处理游戏逻辑

repaint();//调用paint()重画屏幕

Thread.sleep(500);//线程sleep0.5秒

}

}

看上去好象是每次的间隔就是0.5秒。不过有没有想过如果一个复杂逻辑的游戏gameLogic(),和paint()实际上也是需要不少时间来处理的,而且对于一个复杂逻辑的游戏来说每次处理的时间长度都不相同,可能第一次gameLogic()+paint()的时间是0.1秒下一次又有可能是0.01秒。这样不就造成了间隔时间的不固定吗。所以我们必须把gameLogic(),和paint()的运算时间计算进去,就象下面那样。

public void run() {

time0 = System.currentTimeMillis();

while (true) {

time1 = System.currentTimeMillis();

timePassed = time1 - time0;

time0 = time1;

gameLogic();//处理游戏逻辑

repaint();

time1 = System.currentTimeMillis();

if (time1 - time0 < RUN_RATE) {

try {

Thread.sleep(RUN_RATE - (time1 - time0));

}

catch (InterruptedException e) {

}

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航