ждать и уведомить проблему - PullRequest
1 голос
/ 11 октября 2010

Когда я использую метод wait() в следующем коде, он выдает следующее исключение

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 ]

2 голосов
/ 11 октября 2010

Ваш метод wait должен быть заключен в метод synchronized или блок lock, причем объект должен быть заблокирован на объекте, на котором вы хотите ожидать.

В вашем случае выдолжен сделать метод synchronized, что эквивалентно вызову lock (this).

1 голос
/ 11 октября 2010

Вы должны начать wait, установив синхронизацию с переменной ожидания, например,

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

Пожалуйста, внимательно прочитайте javadoc для wait и следуйте ему до буквы, иначе выВас ждут неприятные сюрпризы.

0 голосов
/ 30 июля 2013
  1. синхронизированный блок кода, где "wait ()" равно
  2. не "уведомлять" Thread, "уведомлять" runnable, Thread является классом управления для runnable и Thread обертывают notify / notifyAll / wait с классом монитора
  3. попробуйте использовать interupt и сгенерировать бросок «без ошибок» для приостановки / возобновления нить.
  4. использовать продуцент / потребительский подход
  5. использовать подход fork / join
  6. использовать пул потоков для приостановки и возобновления потока (пауза - уничтожение работает, резюме - работает бассейн)

Любой из этих подходов устранит вашу проблему, сама проблема заключается в том, что вы пытаетесь уведомить уже уведомленный поток, такая же проблема, как запуск уже запущенного потока. Это вызовет исключение IllegalMonitorStateException.

Thread - ужасно написанное решение для Process, но им не так сложно управлять.

...