2015-12-22 11 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 "); 
    } 
} 

wyjścia tego programu jest:wyjątków w Javie dla metody wait()

1 thrown to main 

nie otrzymuję dlaczego ten thrown to main przyszedł tutaj.

+0

może być nie powinno być to sprawdzić: http: //stackoverflow.com/questions/1537116/illegalmonitorstateexception-on-wait-call – soorapadman

+0

Rozumiesz co 'wait()' metoda robi? – Kayaman

+0

@Kayaman To przyjemność, jeśli dasz mi jakiś pomysł na temat metody wait(). –

Odpowiedz

5

Otrzymujesz java.lang.IllegalMonitorStateException, ponieważ obiekt, który wywołujesz() na (t1) nie jest właścicielem blokady synchronizacji.

Należy pamiętać, że po zadeklarowaniu metody jako synchronized właścicielem blokady dla tej metody jest bieżący obiekt (w tym przypadku instancja Bees). Jeśli chcesz zadzwonić wait() na t1, trzeba zsynchronizować na t1:

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

Na marginesie, podczas połowu wyjątek, należy zawsze zawierać wyjątek się do wyjścia dziennika, przynajmniej jak

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

W przeciwnym razie może zostać pominięte ważne informacje (takie jak , który został faktycznie zgłoszony jako wyjątek z).

Zobacz także The Java™ Tutorials: Synchronization.

+0

to jak mogę przezwyciężyć ten błąd? –

2

Trzeba zadzwonić wait od wewnątrz synchronized bloku. Bieżący wątek powinien uzyskać monitor obiektu przed jego oczekiwaniem.

Skopiowane z JavaDoc:

bieżący wątek musi posiadać monitorowania tego obiektu. Wątek zwalnia własność tego monitora i czeka, aż inny wątek powiadomi wątki oczekujące na monitorze tego obiektu, aby obudzić się przez wywołanie metody notify lub metody notifyAll. Wątek następnie czeka, aż będzie mógł ponownie uzyskać prawo własności do monitora i wznowi wykonywanie.

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