IllegalMonitorStateException en la llamada de espera ()

Resuelto Prakash Panjwani asked hace 14 años • 12 respuestas

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?

Prakash Panjwani avatar Oct 08 '09 18:10 Prakash Panjwani
Aceptado

Debes estar en un synchronizedbloque 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.

reccles avatar Oct 08 '2009 11:10 reccles

waitestá definido en Object, y no en él Thread. El monitor encendido Threades 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 waito notify/ notifyAllun objeto, es necesario mantener el candado con la synchronizeddeclaración. Además, necesitará un whilebucle 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.lockslos bloqueos (y java.util.concurrent.atomic) al abordar el subproceso múltiple. Pero utiliza java.util.concurrentestructuras de datos siempre que puedas.

Tom Hawtin - tackline avatar Oct 08 '2009 12:10 Tom Hawtin - tackline

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

Mina avatar Jan 25 '2012 10:01 Mina