Maison  >  Article  >  Java  >  Pourquoi est-ce que j'obtiens une exception IllegalMonitorStateException lorsque j'utilise Wait and Notify de Java ?

Pourquoi est-ce que j'obtiens une exception IllegalMonitorStateException lorsque j'utilise Wait and Notify de Java ?

DDD
DDDoriginal
2024-10-31 16:16:57837parcourir

Why Am I Getting IllegalMonitorStateException When Using Java's Wait and Notify?

Attente et notification de Java : compréhension de l'exception IllegalMonitorStateException

En Java, les méthodes d'attente et de notification permettent aux threads de synchroniser leur exécution. Cependant, une mauvaise utilisation de ces méthodes peut conduire à IllegalMonitorStateException.

Pour comprendre pourquoi, analysons le code fourni :

Main.java

  • Dans le constructeur, le thread principal crée plusieurs threads et les ajoute à une ArrayList.
  • Après avoir imprimé « Runners ready », il appelle notifyAll() pour notifier tous les threads.

Runner.java

  • Dans la méthode run(), chaque coureur entre dans une condition wait(), en attendant une notification du thread principal.

Le problème réside dans l'appel wait() dans Runner.run(). Lorsqu'un thread appelle wait() sur un objet, il doit posséder le moniteur de cet objet. La propriété est établie par synchronisation sur l'objet.

Pour résoudre le problème, synchronisez sur Main.main dans l'appel wait() :

<code class="java">class Runner implements Runnable {
  public void run() {
    try {
      synchronized (Main.main) {
        Main.main.wait();
      }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
  }
}</code>

Cela garantit que le thread actuel possède Main. moniteur principal avant d'entrer la condition wait().

Le même principe s'applique à notify() et notifyAll(). Un thread doit posséder le moniteur de l'objet avant d'émettre ces méthodes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn