1

次のコードのメソッドを使用している場合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()をすでに指定しました。誰かが問題とその解決策を教えてもらえますか?-前もって感謝します

4

3 に答える 3

2

メソッドはメソッドまたはブロックwaitで囲まれている必要があり、オブジェクトは待機したいオブジェクトにロックされています。synchronizedlock

あなたの場合、メソッドを作成する必要があります。synchronizedこれは、を呼び出すのと同じlock (this)です。

于 2010-10-11T12:41:41.407 に答える
1

wait待機変数の同期を取得することから始める必要があります。

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

javadocをよく読んで注意深く待ち、それに従って手紙を読んでください。そうしないと、厄介な驚きに陥ることになります。

于 2010-10-11T12:43:12.837 に答える
0
  1. 「wait()」が
  2. スレッドに「通知」しないでください。実行可能に「通知」します。スレッドは実行可能の制御クラスであり、スレッドはnotify / notifyAll/waitをモニタークラスでラップします。
  3. interuptを使用して、スレッドを一時停止/再開するために「エラーなし」のスロー可能オブジェクトをスローしてみてください。
  4. 生産者/消費者アプローチを使用する
  5. フォーク/結合アプローチを使用する
  6. スレッドの一時停止と再開にスレッドプールを使用します(一時停止-実行可能なキル、再開-実行可能なプール)

これらのアプローチのいずれかで問題が解消されます。問題自体は、すでに通知されているスレッドに通知しようとすることです。これは、すでに開始されているスレッドを開始するのと同じ問題です。IllegalMonitorStateExceptionがスローされます。

スレッドはプロセスに対してひどく書かれたソリューションですが、管理するのはそれほど難しくありません。

于 2013-07-30T11:02:00.377 に答える