"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-14
Parcourir:265

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

Attendre et notifier de Java : comprendre 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 runner 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() :

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

Cela garantit que le thread actuel possède le moniteur de Main.main avant d'entrer dans 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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3