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

Pourquoi est-ce que je reçois une exception IllegalMonitorStateException lorsque j'utilise Wait and Notify de Java ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 19:39:03735parcourir

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

Java Wait and Notify : surmonter IllegalMonitorStateException

Dans votre tentative d'implémenter Wait and Notify en Java, vous avez rencontré l'insaisissable IllegalMonitorStateException. Cette erreur indique que le thread actuel ne possède pas le moniteur associé à l'objet invoqué.

Comprendre la propriété en attente et notifier

Comme indiqué dans la documentation Java pour wait(), un thread doit posséder le moniteur d'un objet avant d'exécuter wait() sur cet objet. De même, les opérations notify() et notifyAll() nécessitent également que le thread appelant soit propriétaire du moniteur.

Application de la synchronisation à la classe Runner

Pour résoudre l'exception IllegalMonitorStateException, vous Vous devez vous assurer que le thread actuel possède le moniteur de l'objet Main avant d'exécuter wait(). Vous pouvez y parvenir en synchronisant la méthode run() de la classe Runner comme suit :

<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>

En synchronisant sur Main.main, vous vous assurez que le thread actuel acquiert le moniteur de l'objet Main avant d'exécuter attendez(). Cela vous permet d'attendre avec succès une notification sans rencontrer l'IllegalMonitorStateException.

Remarque sur la propriété du thread

En Java, un thread acquiert la propriété du moniteur d'un objet lorsqu'il s'exécute de manière synchronisée. blocs ou méthodes synchronisées de cet objet. Il libère la propriété lorsque l'exécution quitte le bloc ou la méthode 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