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