等待并通知问题

时间:2010-10-11 12:37:22

标签: java multithreading jdialog

当我在以下代码中使用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()。任何人都可以告诉我这个问题及其解决方案。 - 提前谢谢

3 个答案:

答案 0 :(得分:2)

您的wait方法需要包含在synchronized方法或lock块中,对象将锁定在您要等待的对象上。

在您的情况下,您应该使用方法synchronized,这相当于调用lock (this)

答案 1 :(得分:1)

您必须通过获取等待变量的同步来启动wait,例如

synchronized( this )
{
    this.wait( );
}

请仔细阅读wait的javadoc,并在信中注明,否则您将会遇到令人讨厌的惊喜。

答案 2 :(得分:0)

  1. 同步代码块,其中“wait()”是
  2. 不要“通知”Thread,“notify”runnable,Thread是runnable的Control类 和Thread包装notify / notifyAll / wait with monitor class
  3. 尝试使用interupt并抛出“非错误”throwable来暂停/恢复 线。
  4. 使用产品/消费者方法
  5. 使用fork / join方法
  6. 使用线程池暂停和恢复线程(暂停 - 杀死 runnable,resume - pool runnable)
  7. 这些方法中的任何一种都可以消除您的问题,问题本身就是您尝试通知已经通知的线程,其问题就像启动已启动的线程一样。它将抛出IllegalMonitorStateException。

    线程是一个可怕的写入解决方案,但它不是很难管理。