我有一个渲染项目的方法。
我遇到的问题是我想让开关盒在4.1秒后断开。我不想使用Thread.sleep
,因为它会在运行时冻结整个屏幕。
这是我尝试过的,但它不起作用:
private void drawItems(){
itemSelected = randomInt.getValue3();
switch (itemSelected){
case 0: if (!Obstacle.case0) {
doSomething();
}
new java.util.Timer().schedule(
new java.util.TimerTask() {
public void run() {
break;
}
},
4100
);
// other cases
我想打破它,因为否则屏幕上会呈现多于1个项目,但问题是“中断”需要在交换机或循环之外。
在最简单的形式,如:
public class DrawingThread extends Thread {
private boolean goon = true;
public void run() {
//Drawing routine.. stop if goon is no longer true
}
public void requestStop() {
goon = false;
}
}
然后在你的主方法/驱动程序类等:
DrawingThread dThread = new DrawingThread();
dThread.start();
//Other things, for instance try { Thread.sleep(4100) } catch (InterruptedException ie) {}
dThread.requestStop();
Some pointers at Jenkov.com,也在Oracle的java文档中。如果这对您有用,请查看重用Thread对象,该页面侧栏中第26点下的某些内容可能会有用。
你根本不应该触发线程,只需使用增量时间处理时间,你也可以稍后创建一个包装器:
这是我的计时器实现:libgdx Timer countdown implmentation
没有足够的声誉来评论,但我不会像人们建议的那样使用本机Java线程来解决这个问题。我注意到这篇文章被标记为Libgdx。 Libgdx在其文档中明确指出不支持线程,因此我会谨慎使用它们。
你应该做的是间隔调用drawItems函数。 Libgdx有自己的计时器类,我认为它们使用与主线程相同的线程(虽然我不会引用我,我会使用Hllink的答案来确定)。从当前代码中删除计时器计划并将其移动到任何调用drawItems函数,每次完成时重新启动计时器,以便计时器无限循环(如果需要)。我现在正在打电话,所以我稍后会弹出我的桌面并发布代码。