2009-12-13 5 views
0

J'ai créé ce programme idiot de jouer avec wait()Comprendre attente()

public class WaitTest { 
    public static void main(String [] args) { 

     System.out.print("1 "); 
     synchronized(args){ 

     System.out.print("2 "); 

     try { 
      args.wait(); 
      args.notifyAll(); 
     } 
     catch(InterruptedException e){ System.out.print("exception caught");} 

     System.out.print("3 "); 
     } 
    } 
} 

Sur ma machine, le code ne fait jamais d'imprimer 3, à moins que j'écris wait(100) ou un autre nombre de millisecondes. Pourquoi est-ce?

+5

Pourriez-vous essayer de lire au moins une demi-heure sur un certain concept avant de poser une autre question? – Bozho

+1

C'est une suggestion très intéressante, merci. Vous avez été très utile. – andandandand

+2

Eh bien, j'ai été utile, vous fournir une réponse. Maintenant, en retour, vous devriez prendre mes commentaires au sérieux;) – Bozho

Répondre

7

Vous effectuez wait() avant le notifyAll(). wait() va bloquer. Lorsque vous définissez la valeur du délai d'attente, wait() expire, puis votre programme continue. Si vous voulez que votre programme fonctionne, créez un thread et faites-y notifyAll(). wait() et notifyAll sont conçus pour la synchronisation inter-thread.

5

Vous n'avez qu'un fil de discussion. wait() attend une notification d'un autre thread.

3

Comme aucun autre thread n'indique le moniteur de l'objet que vous attendez, il bloque juste là. Et comme vous synchronisez et attendez une variable locale, presque aucun autre thread ne pourra appeler le notify() dessus.

+0

Merci, cela m'a fait gagner du temps (et fourni du contenu pour les autres à apprendre). Bien joué, mec. – andandandand

6

wait et notifyAll sont pour le multithreading. args.wait() attendra pour toujours jusqu'à ce que d'autres thread appelle args.notifyAll() ou args.notify(). Lorsque vous appelez le args.wait(100), il attend 100ms, expire et se poursuit.

Si vous êtes familier avec les sémaphores, c'est essentiellement ce que wait/notify sont.

1

De http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html

Quand attente est invoquée, le fil libère le verrou et suspend l'exécution . À un certain temps futur, un autre thread, aura la même serrure et invoquer Object.notifyAll, informer toutes les discussions en attente sur cette serrure que quelque chose d'important a est arrivé:

Java est un excellent tutoriel ressource d'apprentissage.