为什么在类中发出通知时未引发IllegalMonitorStateException

时间:2018-07-20 17:00:50

标签: wait notify illegalmonitorstateexcep

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

由于我觉得一个示例优于10行,所以这是我不了解的内容的简化版本,因此我不理解为什么我链接的工作以及/**/之间没有什么联系't ,如果它可以一直正常工作

我的战斗课:

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){}

}

1 个答案:

答案 0 :(得分:0)

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

应该工作。我假设您尝试在keyPressed方法中执行sync(this),并且那里的“ this”是指Frame类,而不是争斗类。您需要锁定要在其上调用notify()的对象。