private class PaintThread implements Runnable {
private boolean running = true;
private boolean pause = false;
public void run() {
while(running) {
if(pause)  {
//System.out.println("1211");
continue;
}
else repaint();

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void pause() {
this.pause = true;
}

public void reStart() {
s = new Snake(Yard.this);
gameOver = false;
this.pause = false;
System.out.println("12");
}

}
经过我调试时发现线程运行都没问题,因为代码不全,所以解释一下运行的过程:当蛇死掉,“palse = true”;跳出repaint()方法,直接执行continue,running不变,一直为true,故一直在while(running)的循环里,当按下”F2“,调用reStart(),”palse = false“跳出continue,执行repaint();按道理应该重新开始,但是没反应。
接着问题来了,我加入调试语句,我用红色注明的地方”System.out.println("1211");“再按F2,运行就实现了重新开始,当我再注释到”System.out.println("1211");“,按下F2,又没反应了。这是什么原因。求大神指点!

解决方案 »

  1.   

    没看到整个代码,无法确定,按照我估计,running控制贪吃蛇的一局,pause控制的是暂停。你沿着这个思路想一想。如果方便也可以把项目打包出来,帮你调试一下。
    我也做过贪吃蛇,不过,我是把蛇的身体分成节,每节是一个Canvas对象,然后再做一个表示蛇的类,总体管理移动,这样可以脱离底层的绘图,通过控制位置来实现蛇的运动、增加新节的操作。
      

  2.   

    我是想问,为什么我加上了那个调试语句,整个程序就好了,注释掉就不行了,我用红色标注的地方,难道跟continue有关?
      

  3.   

    把下面的代码 if(pause)  {
                        <span style="color: #FF0000;">//System.out.println("1211");</span>
                        continue;
                    }
                    else repaint();修改成下面这样 if(!pause)  {
                        repaint();
                    }然后试一试
      

  4.   


    对的呢!可以了,这是为什么呢?continue有什么特性吗?
      

  5.   

    你那个直接使用continue的,没有对线程做休眠,那么它会以系统调度给它的时间片的最大可能的速度运行,我不知道你做暂停是怎么处理的,我怀疑是不是按键时系统正在处理这个线程,你要修改的那个标识量根本就没有被修改啊?