当我在以下代码中使用wait()
方法时,它会抛出以下Exeption
Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException
代码如下:
private void newMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
newFileChooser = new JFileChooser();
int returnVal = newFileChooser.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
filename = newFileChooser.getSelectedFile();
JFrame mainFrame = NetSimApp.getApplication().getMainFrame();
networktype = new NetType(mainFrame);
networktype.setLocationRelativeTo(mainFrame);
NetSimApp.getApplication().show(networktype);
try {
this.wait();
} catch (InterruptedException ex) {
Logger.getLogger(NetSimView.class.getName()).log(Level.SEVERE, null, ex);
}
if (!NetType.validip) {
statusTextArea.append("File not created:Select Network Type.\n");
}
newNodeMenuItem.setEnabled(true);
} else {
newNodeMenuItem.setEnabled(false);
statusTextArea.append("File not created:Access cancelled by user.\n");
}
}
实际上我正在调用jDialog类的对象,我想首先完成对话框对象,然后它应该通知上面给出的代码。我已经在该类中指定了notify()。任何人都可以告诉我这个问题及其解决方案。 - 提前谢谢
答案 0 :(得分:2)
您的wait
方法需要包含在synchronized
方法或lock
块中,对象将锁定在您要等待的对象上。
在您的情况下,您应该使用方法synchronized
,这相当于调用lock (this)
。
答案 1 :(得分:1)
您必须通过获取等待变量的同步来启动wait
,例如
synchronized( this )
{
this.wait( );
}
请仔细阅读wait的javadoc,并在信中注明,否则您将会遇到令人讨厌的惊喜。
答案 2 :(得分:0)
这些方法中的任何一种都可以消除您的问题,问题本身就是您尝试通知已经通知的线程,其问题就像启动已启动的线程一样。它将抛出IllegalMonitorStateException。
线程是一个可怕的写入解决方案,但它不是很难管理。