[英]Thread.sleep() in while loop doesn't work properly?
该对象应该每5秒更改一次模式(运动算法)。 我首先尝试了一个while循环,但是循环太快了。 然后,我添加了Thread.sleep(5000)
但是我的对象仍然只能以一种算法( scatterMode
)移动。 这是算法:
//LEVEL 1
//scatter for 7s
//chase for 20s
//scatter for 7s
//chase for 20s
//scatter for 5s
//chase for 20s
//scatter for 5s
//chase indefinite
这是代码。 如果需要查看构造函数和变量声明,请在底部。
public void updateMode() throws InterruptedException {
while(ghostalive){
if(seconds<7){
Thread.sleep(100);
mode = scatterMode;
}
if(7<seconds && seconds<27){
Thread.sleep(5000);
mode = chaseMode;
}
if(27<seconds && seconds<34){
Thread.sleep(5000);
mode = scatterMode;
}
if(34<seconds && seconds<54) {
Thread.sleep(5000);
mode = chaseMode;
}
if(54<seconds && seconds>59) {
mode = scatterMode;
}
if(59< seconds && seconds<79){
mode = chaseMode;
}
if(seconds>84){
mode = scatterMode;
ghostalive=false;
}
seconds++;
ghostalive=false;
}
}
private int seconds=0;
private boolean ghostalive=true;
protected static final int chaseMode = 0;
protected static final int scatterMode = 1;
static int mode = scatterMode; //initially ghost start in scatterMode
public Ghost(int x, int y, Maze maze) throws InterruptedException{
super(x, y, maze);
futureDirection = 0;
timer = 0;
updateMode();
//chaseMode = false;
//frightenedMode = false;
}
public static int getMode(){
return mode;
}
您的睡眠方式是毫秒和几秒钟的混合,但是您希望数秒。
尝试这样的事情:
while(ghostalive){
if(seconds<7){
mode = scatterMode;
}
if(7<seconds && seconds<27){
mode = chaseMode;
}
if(27<seconds && seconds<34){
mode = scatterMode;
}
if(34<seconds && seconds<54) {
mode = chaseMode;
}
if(54<seconds && seconds>59) {
mode = scatterMode;
}
if(59< seconds && seconds<79){
mode = chaseMode;
}
if(seconds>84){
mode = scatterMode;
ghostalive=false;
}
seconds++;
Thread.Sleep(1000);//Sleep for one second only
//ghostalive=false; // Should this be here? Ghost is set to not alive after each loop?
}
我将睡眠移动到了if语句之后,以便在每个循环中保持一致。
我认为您不应该依赖睡眠来测量时间,因为它在每次运行时都会有所不同。 线程可以进入睡眠时间超过上述时间。 睡眠仅在特定时间暂停当前线程。 它不能保证此线程将在同一时间之后再次开始执行。
不要调用updateMode
从构造函数。
而是,启动一个新线程。
到目前为止,可能发生以下情况:您的Ghost已创建,在构造函数完成之前经历了他的所有阶段。 然后,当您的主程序启动时,您的幽灵为ghostalive=false
, scatterMode
已经处于scatterMode
。
为了进行调试,请放入许多Loggin语句。 最好使用日志记录API,但是许多初学者更喜欢System.out.println
。 只是打印您正在做的事情是个好习惯,即您将幻像设置为哪种模式。
然后,当您还添加游戏计时器内容时,您应该很容易地看到,在您的实际游戏开始之前,幽灵首先经历了他的所有状态(即,“游戏已经开始”记录也是必须的)。
记录根本没有打印困难。
// for each class, add such a line:
private static final LOG = java.util.logging.Logger.getLogger("packagename.classname");
static {
// Configure the active logging level manually
// For larger projects, use a .properties file!
LOG.setLevel(java.util.logging.Level.ALL);
}
// inside of appropriate methods, use
if (LOG.isLoggable(Level.DEBUG)) {
LOG.log(Level.DEBUG, "My ghost is now frightened.");
}
if
语句很重要。 可以通过热点很好地对其进行优化,因此,如果禁用了日志记录,则日志记录语句几乎是免费的。
好消息是您可以轻松地打开和关闭这些语句。 在System.out.println
您必须手动删除并读取代码。
当秒数恰好是7或34或54 ...时,没有条件可以处理这些情况。 它只是不输入任何if语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.