IllegalMonitorStateException en la llamada de espera ()
Estoy usando subprocesos múltiples en Java para mi programa. He ejecutado el hilo exitosamente pero cuando lo estoy usando Thread.wait()
, se lanza java.lang.IllegalMonitorStateException
. ¿Cómo puedo hacer que un hilo espere hasta que sea notificado?
Debes estar en un synchronized
bloque del objeto que deseas esperar para que Object.wait()
funcione.
Además, recomiendo mirar los paquetes de concurrencia en lugar de los paquetes de subprocesamiento de la vieja escuela. Son más seguros y mucho más fáciles de trabajar .
Supuse que te referías Object.wait()
a que tu excepción es lo que sucede cuando intentas obtener acceso sin mantener el bloqueo de objetos.
wait
está definido en Object
, y no en él Thread
. El monitor encendido Thread
es un poco impredecible.
Aunque todos los objetos Java tienen monitores, generalmente es mejor tener un bloqueo dedicado:
private final Object lock = new Object();
Puede obtener diagnósticos un poco más fáciles de leer, con un pequeño costo de memoria (alrededor de 2 K por proceso) utilizando una clase con nombre:
private static final class Lock { }
private final Object lock = new Lock();
Para wait
o notify
/ notifyAll
un objeto, es necesario mantener el candado con la synchronized
declaración. Además, necesitará un while
bucle para verificar la condición de activación (busque un buen texto sobre subprocesos para explicar por qué).
synchronized (lock) {
while (!isWakeupNeeded()) {
lock.wait();
}
}
Notificar:
synchronized (lock) {
makeWakeupNeeded();
lock.notifyAll();
}
Vale la pena comprender tanto el lenguaje Java como java.util.concurrent.locks
los bloqueos (y java.util.concurrent.atomic
) al abordar el subproceso múltiple. Pero utiliza java.util.concurrent
estructuras de datos siempre que puedas.
Sé que este hilo tiene casi 2 años, pero aún necesito cerrarlo ya que también llegué a esta sesión de preguntas y respuestas con el mismo problema...
Lea esta definición de ilegalMonitorException una y otra vez...
Se lanza IllegalMonitorException para indicar que un subproceso ha intentado esperar en el monitor de un objeto o para notificar a otros subprocesos que esperan en el monitor de un objeto sin poseer el monitor especificado.
Esta línea dice una y otra vez: IllegalMonitorException ocurre cuando ocurre una de las 2 situaciones....
1> esperar en el monitor de un objeto sin poseer el monitor especificado.
2> notificar a otros subprocesos que esperan en el monitor de un objeto sin poseer el monitor especificado.
Algunos podrían haber obtenido sus respuestas... y todos no, entonces por favor marque 2 afirmaciones...
sincronizado (objeto)
objeto.esperar()
Si ambos objetos son iguales... entonces no puede aparecer ninguna excepción ilegal de Monitor.
Ahora lea nuevamente la definición de IllegalMonitorException y no la olvidará nuevamente...