1

我想知道为什么我不能直接将我的方法中的内容直接写入battle.resume()我的frame.keyPressed()方法中?如果这样做,我会收到 IllegalMonitorStateException,我在网上发现此异常是“抛出以指示线程已尝试在对象的监视器上等待或通知其他线程在对象的监视器上等待而不拥有指定的监视器”,所以我认为它必须直接在您要等待/通知的班级中。

因为我觉得一个例子比 10 行好,所以这里有一个我不明白的简化版本,我不明白为什么我链接的工作和之间的工作/**/工作,如果它会全部工作时间

我的战斗课:

public class Battle{

    public void run(){

        while(true){
            System.out.println("START");
            synchronized(this){
                try{
                    wait();
                }catch(InterruptedException e){}
            }
            System.out.println("END");
        }

    }

    public void resume(){

        synchronized(this){
            notify();
        }

    }

}

我的框架类:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Frame extends JFrame implements KeyListener{

    private Battle battle;

    public Frame(){

        this.battle = new Battle();

        setTitle("ControlerPanel");
        setSize(200, 200);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(this);

        setVisible(true);

        battle.run();

    }

    public Battle getBattle(){

        return battle;

    }

    @Override
    public void keyPressed(KeyEvent e){

        if(e.getKeyCode() == KeyEvent.VK_A){
            battle.resume();
        }

    }

    @Override
    public void keyReleased(KeyEvent e){}

    @Override
    public void keyTyped(KeyEvent e){}

}
4

1 回答 1

0
synchronized(battle){
   battle.notify();
}

应该管用。我假设您尝试在您的 keyPressed 方法中执行同步(此),并且“此”指的是 Frame 类,而不是战斗。您需要锁定您正在调用 notify() 的对象。

于 2018-07-20T17:04:56.403 回答