"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que estou recebendo IllegalMonitorStateException ao usar o Wait and Notify do Java?

Por que estou recebendo IllegalMonitorStateException ao usar o Wait and Notify do Java?

Publicado em 2024-11-14
Navegar:110

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

Espera e notificação do Java: entendendo IllegalMonitorStateException

Em Java, os métodos wait e notify permitem que os threads sincronizem sua execução. No entanto, usar esses métodos incorretamente pode levar a IllegalMonitorStateException.

Para entender o porquê, vamos analisar o código fornecido:

Main.java

  • No construtor, o thread principal cria vários threads e os adiciona a um ArrayList.
  • Depois de imprimir "Runners ready", ele chama notifyAll() para notificar todos os threads.

Runner.java

  • No método run(), cada executor insere uma condição wait() , aguardando uma notificação do thread principal.

O problema está na chamada wait() em Runner.run(). Quando um thread chama wait() em um objeto, ele deve possuir o monitor desse objeto. A propriedade é estabelecida pela sincronização no objeto.

Para corrigir o problema, sincronize em Main.main dentro da chamada wait():

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

Isso garante que o thread atual possua o monitor Main.main antes de inserir a condição wait().

O mesmo princípio se aplica a notify() e notifyAll(). Um thread deve possuir o monitor do objeto antes de emitir esses métodos.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3