我想知道为什么我不能直接将我的方法中的内容直接写入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){}
}