"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué obtengo IllegalMonitorStateException cuando uso Wait and Notify de Java?

¿Por qué obtengo IllegalMonitorStateException cuando uso Wait and Notify de Java?

Publicado el 2024-11-14
Navegar:644

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

Esperar y notificar de Java: comprensión de IllegalMonitorStateException

En Java, los métodos de espera y notificación permiten que los subprocesos sincronicen su ejecución. Sin embargo, el uso incorrecto de estos métodos puede generar IllegalMonitorStateException.

Para entender por qué, analicemos el código proporcionado:

Main.java

  • En el constructor, el hilo principal crea múltiples hilos y los agrega a una ArrayList.
  • Después de imprimir "Runners ready", llama notifyAll() para notificar a todos los hilos.

Runner.java

  • En el método run(), cada corredor ingresa una condición de espera() , esperando una notificación del hilo principal.

El problema radica en la llamada wait() en Runner.run(). Cuando un hilo llama a wait() en un objeto, debe ser propietario del monitor de ese objeto. La propiedad se establece sincronizando el objeto.

Para solucionar el problema, sincronice en Main.main dentro de la llamada wait():

class Runner implements Runnable {
  public void run() {
    try {
      synchronized (Main.main) {
        Main.main.wait();
      }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
  }
}

Esto garantiza que el hilo actual sea propietario del monitor Main.main antes de ingresar a la condición de espera().

El mismo principio se aplica a notify() y notifyAll(). Un hilo debe poseer el monitor del objeto antes de emitir estos métodos.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3