Maison  >  Article  >  Java  >  Pourquoi est-ce que j'obtiens `IllegalMonitorStateException` lorsque j'utilise `wait()` en Java ?

Pourquoi est-ce que j'obtiens `IllegalMonitorStateException` lorsque j'utilise `wait()` en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 05:25:02617parcourir

Why Do I Get `IllegalMonitorStateException` When Using `wait()` in Java?

Java Wait and Notify : Comprendre IllegalMonitorStateException

Dans la programmation multithread, les méthodes wait() et notify() permettent aux threads de coordonner leurs actions. Cependant, une utilisation incorrecte de ces méthodes peut conduire à IllegalMonitorStateException.

Dans l'extrait de code donné, dans la classe Main, vous essayez d'appeler wait() sur Main.main. Cependant, vous rencontrez une IllegalMonitorStateException. En effet, le thread actuel (thread principal) ne détient pas le verrou sur l'objet Main.main.

Pour résoudre ce problème, vous devez synchroniser le bloc de code où wait() est appelé. Ceci peut être réalisé en utilisant un bloc synchronisé(...) sur l'objet que vous souhaitez attendre. Dans ce cas, il s'agit de l'objet Main.main :

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

En synchronisant sur l'objet Main.main, vous vous assurez que le thread courant (le thread runner) acquiert le verrou sur l'objet avant d'exécuter l'attente (). Lorsque notifyAll() est appelé depuis la classe Main, tous les threads d'exécution seront notifiés et pourront procéder à leur exécution.

Le même principe s'applique aux méthodes notify() et notifyAll(). Ils ne peuvent être appelés que par le thread qui détient le verrou sur l'objet synchronisé.

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