我想知道为什么我不能直接将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){}
}
答案 0 :(得分:0)
synchronized(battle){
battle.notify();
}
应该工作。我假设您尝试在keyPressed方法中执行sync(this),并且那里的“ this”是指Frame类,而不是争斗类。您需要锁定要在其上调用notify()的对象。