Exception bei Button mit wait() und notifyAll()

Itz_Marlon

Neues Mitglied
Hi,

ich habe eine for-Schleife implementiert und an das Ende dieser folgendes gesetzt:

Java:
buttonEnde.setEnabled(true);
                try {
                    wait();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                }

Der Button sieht so aus:

Java:
buttonEnde.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                notifyAll();
            }
        });

Der Haupt Thread schläft auch gut ein, wenn ich allerdings auf den Button Klicke bekomme ich folgende Exception:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at Spiel$1.actionPerformed(Spiel.java:102)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Kann mir da jemand helfen?
 
Schau dir mal das synchronized-Schlüsselwort an. Übrigens war es für den Aufruf von wait() auch notwendig, einen Lock auf das Objekt zu haben.
Beim zweiten Blick auf deinen Code, rufst du ja notifyAll() auf dem impliziten `this` Objekt auf, welches in diesem lexikalischen Kontext deine ActionListener-Instanz ist. Ich glaube nicht, dass du notifyAll() auf diesem ActionListener aufrufen wolltest, sondern auf dem Objekt, auf welchem du vorher wait() aufgerufen hattest, also auf dem Objekt, welches in diesem Kontext `this` war:
Java:
buttonEnde.setEnabled(true);
try {
  wait(); // <- äquivalent zu this.wait();
} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
  e.printStackTrace();
}
 

Neue Themen


Zurück
Oben