Java 正在等待的线程未恢复

Java 正在等待的线程未恢复,java,android,multithreading,Java,Android,Multithreading,我一直在做一个游戏,在屏幕上画一个缩小的圆圈,用一个手指按屏幕,你必须保持在这些圆圈上。如果你离开圈子,你就输了 我正试图让这个游戏暂停一个线程,并在失败后游戏停止时恢复它(我是线程,即使它什么都不做,它看起来也是处理器密集型的)。我在下面包含了一些代码,以及所有提供的触摸事件方法 有人知道我哪里出错了吗?我已经研究了许多线程,并尝试了许多不同的方法,但到目前为止都没有成功 我省略了一些代码来保持它的整洁 公共类MainActivity扩展活动{ ... 主线程; 创建时的公共void(Bund

我一直在做一个游戏,在屏幕上画一个缩小的圆圈,用一个手指按屏幕,你必须保持在这些圆圈上。如果你离开圈子,你就输了

我正试图让这个游戏暂停一个线程,并在失败后游戏停止时恢复它(我是线程,即使它什么都不做,它看起来也是处理器密集型的)。我在下面包含了一些代码,以及所有提供的触摸事件方法

有人知道我哪里出错了吗?我已经研究了许多线程,并尝试了许多不同的方法,但到目前为止都没有成功

我省略了一些代码来保持它的整洁

公共类MainActivity扩展活动{
...
主线程;
创建时的公共void(Bundle savedInstanceState){
...
暂停=真;
mainThread=新线程(newrunnable(){
公开募捐{
已同步(此){
如果(暂停){
试一试{
暂停=错误;
等待();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
while(true){
如果(!暂停){
…游戏的东西。。。
}
}
}
});
mainThread.start();
}
公共事件(运动事件e){
如果(如getPointerCount()==1){
开关(如getActionMasked()){
case MotionEvent.ACTION\u DOWN:
如果(alertDialog==null){
go();
}else if(alertDialog.isShowing()==false){
go();
}
返回true;
case MotionEvent.ACTION\u UP:
暂停();
saveHighScore();
对话框(“您从屏幕上抬起手指!\n”+
您为“+getScore()+”打分\n+
“你的高分是”+getHighScore());
重置();
返回true;
case MotionEvent.ACTION\u移动:
如果(alertDialog==null){
go();
}else if(alertDialog.isShowing()==false){
如果(!checkBounds(e.getX(),e.getY())){
暂停();
saveHighScore();
对话框(“您移动到了圆之外!\n”+
您为“+getScore()+”打分\n+
“你的高分是”+getHighScore());
重置();
}
}
返回true;
}
}否则{
暂停();
saveHighScore();
对话框(“一次只能使用一根手指!\n”+
您为“+getScore()+”打分\n+
“你的高分是”+getHighScore());
重置();
}
返回true;
}
私有同步无效暂停(){
暂停=真;
}
私有同步void go(){
if(mainThread.getState()==Thread.State.WAITING){
暂停=错误;
通知();
}
}

问题出在主线程中。它在暂停状态下启动,将取消暂停一次,然后永远卡在主线程中

while (true) {
   if (!paused) {
      ... GAME STUFF ...
   }
}
如果pause再次变为true,您将只是主动循环,而不执行游戏内容。线程没有休眠(这就是为什么它在不执行任何操作的情况下非常活跃),因此此If语句永远不会执行

if (mainThread.getState() == Thread.State.WAITING) {
    paused = false;
    notify();
}
暂停仍然是正确的

您可以这样修复:

mainThread = new Thread() {public void run() {

        while (true) {
            if (!paused) {
                //... GAME STUFF ...
            }
            else synchronized (this) {
                try {
                    paused = false;
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
};
另外,将notify()更改为:


wait和notify方法必须在同一个对象上调用(在线程内部)

因此它正在运行,您无法将手指放在圆圈上,它停止,但永远不会恢复?操作向下位调用
go()
只要我按下屏幕上的按钮,就会通知线程重新启动。我是新手。你能解释一下你的程序上下文中的alertDialog是什么吗?
对话框
方法调用我编写的一个方法,它只会显示Android对话框窗口,并说“你失败了!”。它不控制任何游戏状态数据。
reset()
将一些计数器值重置为0(用于得分)@luxer,等待除外()是在Runnable对象上调用的,而不是Thread对象!很容易错过…抱歉,不确定这如何帮助解决我的问题。我知道暂停它的位是不可访问的,所以我将它放在循环中,但仍然没有运气。@daogle您是否完全尝试了我提供给您的代码?@daogle更新为在c中发现的错误通知位omments@daogle请注意,新的螺纹线稍有更改(括号在末尾)
synchronized (mainThread) {mainThread.notify();}