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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top