2016-06-07 6 views
0

Warum warten und benachrichtigen Funktion funktioniert nicht richtig auf der gleichen Klassensperre?Warum warten und benachrichtigen Funktion funktioniert nicht richtig auf der gleichen Klassensperre

Bitte überprüfen Sie unten Code für warten und benachrichtigen Funktionalität und ihre Ausgabe.

Ausgang:

Thread-1 
Thread-2 
Thread-2 after notify 

Erwartetes Ergebnis:

Thread-1 
Thread-2 
Thread-2 after notify 
Thread-1 after wait  

Code:

public class WaitAndNotify1 {  
    public static void main(String[] args) {   
     Thread t1=new Thread(new Runnable(){    
      @Override 
      public void run(){     
       System.out.println("Thread-1");     
       try { 
        synchronized (this) { 
         wait(); 
         System.out.println("Thread-1 after wait"); 
        }      
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     Thread t2=new Thread(new Runnable(){    
      @Override 
      public void run(){ 
       try { 
        Thread.sleep(4000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("Thread-2"); 
       synchronized (this) { 
        notify(); 
        System.out.println("Thread-2 after notify"); 
       } 
      } 
     }); 
     t1.start(); 
     t2.start(); 
    } 
} 
+0

Es würde wirklich helfen, wenn Sie Ihren Code richtig in Zukunft formatiert werden könnte. .. –

Antwort

5

Sie this von einer anonymen inneren Klasse mit - so bezieht er sich auf die Instanz von diese anonyme innere Klasse. Es gibt zwei verschiedene Instanzen (von verschiedenen anonymen inneren Klassen), also rufen Sie wait() auf einem anderen Objekt als das, das Sie anrufen notify() an.

Sie haben momentan keine Instanz von WaitAndNotify1, um sich gerade zu synchronisieren. Sie könnten den Code auf eine Instanz Methode bewegen, dann WaitAndNotify1.this verwenden, um die Instanz zu verweisen - an welcher Stelle Sie Ihre erwartete Ausgabe bekommen:

public class WaitAndNotify1 { 
    public static void main(String[] args) { 
     new WaitAndNotify1().test(); 
    } 

    public void test() { 
     Thread t1=new Thread(new Runnable(){    
      @Override 
      public void run(){     
       System.out.println("Thread-1");     
       try { 
        synchronized (WaitAndNotify1.this) { 
         WaitAndNotify1.this.wait(); 
         System.out.println("Thread-1 after wait"); 
        }      
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     Thread t2=new Thread(new Runnable(){    
      @Override 
      public void run(){ 
       try { 
        Thread.sleep(4000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("Thread-2"); 
       synchronized (WaitAndNotify1.this) { 
        WaitAndNotify1.this.notify(); 
        System.out.println("Thread-2 after notify"); 
       } 
      } 
     }); 
     t1.start(); 
     t2.start(); 
    } 
}