Comprendre attente ()
-
19-09-2019 - |
Question
J'ai créé ce programme idiot de jouer avec wait()
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?
La solution
Vous faites l'attente () avant la notifyAll (). wait () va bloquer. Lorsque vous mettez la valeur de délai d'attente, attendez () le délai expire et votre programme se poursuivra. Si vous voulez que votre programme fonctionne, créer un fil et faire votre notifyAll () là-bas. attendre () et notifyAll sont conçus pour la synchronisation interthread.
Autres conseils
wait
et notifyAll
sont pour le multithreading. args.wait()
attendra toujours jusqu'à ce qu'un autre thread appelle args.notifyAll()
ou args.notify()
.
Lorsque vous appelez args.wait(100)
, il attend 100ms, le calendrier sur, et continue.
Si vous connaissez sémaphores, qui est essentiellement ce que attente / notify sont.
Vous avez un seul fil. wait () est en attente d'un autre thread d'informer.
Comme aucun autre thread informe le moniteur de l'objet que vous attendez sur, il bloque juste là. Et puisque vous synchronisez et en attente sur une variable locale, serait en mesure d'appeler à peine tout autre fil notify()
dessus.
De http://java.sun.com/ docs / livres / tutorial / essentiel / concurrency / guardmeth.html
attente est invoquée, le fil libère le verrou et suspend exécution. À un certain temps futur, un autre thread acquérir le même verrouiller et invoquer Object.notifyAll, informer tous les threads en attente sur ce verrouillez que quelque chose d'important a est arrivé:
Le Java Tutorial est une excellente ressource d'apprentissage.