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
Runner.java
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.
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