2016-06-07 2 views
0

Pourquoi attendre et notifier la fonction ne fonctionne pas correctement sur le verrou de même classe?Pourquoi attendre et notifier la fonction ne fonctionne pas correctement sur le même verrou de classe

Veuillez voir ci-dessous le code ci-dessous pour les fonctions d'attente et de notification et leur sortie.

Sortie:

Thread-1 
Thread-2 
Thread-2 after notify 

Résultat attendu:

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

Il serait vraiment utile si vous pouvez formater votre code correctement à l'avenir. .. –

Répondre

5

Vous utilisez this d'une classe interne anonyme - il fait référence à l'instance de cette classe interne anonyme. Il existe deux instances différentes (de classes internes anonymes différentes). Vous appelez donc wait() sur un objet différent de celui que vous appelez notify().

Vous n'avez pas actuellement d'instance de WaitAndNotify1 à synchroniser pour le moment. Vous pouvez déplacer le code à une méthode d'instance, puis utilisez WaitAndNotify1.this de se référer à l'instance - à quel point vous obtiendrez votre résultat attendu:

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(); 
    } 
}