2015-12-22 2 views
5
public class Bees { 
    public static void main(String[] args) { 
     try { 
      new Bees().go(); 
     } catch (Exception e) { 
      System.out.println("thrown to main" + e); 
     } 
    } 

    synchronized void go() throws InterruptedException { 
     Thread t1 = new Thread(); 
     t1.start(); 
     System.out.print("1 "); 
     t1.wait(5000); 
     System.out.print("2 "); 
    } 
} 

Ausgabe dieses Programms ist:Ausnahme in Java für wait() Methode

1 thrown to main 

ich nicht bekommen, warum diese thrown to main hierher kam.

+0

kann sein, sollten Sie dies haben überprüfen: http: //stackoverflow.com/questions/1537116/illegalmonitorstateexception-on-wait-call – soorapadman

+0

Verstehen Sie, was das 'wait()' Methode funktioniert? – Kayaman

+0

@Kayaman Seine Freude, wenn Sie mir eine Idee über die Methode wait() geben. –

Antwort

5

Sie erhalten eine java.lang.IllegalMonitorStateException, weil das Objekt, das Sie anrufen wait() on (t1) nicht die Synchronisationssperre besitzt.

Beachten Sie, dass der Sperrbesitzer für diese Methode das aktuelle Objekt (Ihre Instanz von Bees in diesem Fall) ist, wenn Sie eine Methode wie synchronized deklarieren. Wenn Sie wait() auf t1 anrufen möchten, müssen Sie auf t1 synchronisieren:

... 
    Thread t1 = new Thread(); 
    synchronized(t1) { 
     t1.start(); 
     System.out.print("1 "); 
     t1.wait(5000); 
    } 
... 

Auf einer Seite zur Kenntnis, wenn eine Ausnahme zu kontrollieren, sollten Sie immer auch die Ausnahme selbst in die Log-Ausgabe, zumindest wie

... 
} catch (Exception e) { 
    System.out.println("thrown to main" + e); 
} 
... 

Andernfalls könnten Sie wichtige Informationen (wie , die Ausnahme tatsächlich geworfen wurde) vermissen.

Siehe The Java™ Tutorials: Synchronization.

+0

dann wie kann ich diesen fehler überwinden? –

2

Sie auch wait von innen synchronized Block aufrufen müssen. Der aktuelle Thread sollte den Monitor des Objekts abrufen, bevor er wartet.

von JavaDoc Kopierte:

Der aktuelle Thread dieses Objekts Monitor besitzen müssen. Der Thread gibt den Besitz dieses Monitors frei und wartet, bis ein anderer Thread Threads benachrichtigt, die auf dem Monitor dieses Objekts warten, entweder durch einen Aufruf der notify-Methode oder der notifyAll-Methode. Der Thread wartet dann, bis er den Besitz des Monitors wieder erlangen und die Ausführung fortsetzen kann.

synchronized (obj) { 
    while (<condition does not hold>) 
     obj.wait(); 
    ... // Perform action appropriate to condition 
} 
Verwandte Themen