Os métodos wait, notify e notifyAll são os métodos nativos finais da classe Object. Portanto, esses métodos não podem ser substituídos por subclasses. A classe Object é a superclasse de todas as classes, portanto, existem as três formas a seguir de chamada de espera e outros métodos no programa.
Copie o código do código da seguinte forma:
espere(); //Método 1:
this.wait();//Método 2:
super.wait();//Método 3
void notificarTodos()
Desbloqueia todos os threads que chamam o método wait neste objeto. Este método só pode ser chamado dentro de um método sincronizado ou bloco sincronizado. Se o thread atual não for o detentor do bloqueio, esse método lançará uma IllegalMonitorStateException.
notificação nula()
Selecione aleatoriamente um thread que chame o método wait no objeto para desbloqueá-lo. Este método só pode ser chamado dentro de um método sincronizado ou bloco sincronizado. Se o thread atual não for o detentor do bloqueio, esse método lançará uma IllegalMonitorStateException.
espera nula()
Faz com que o thread entre em um estado de espera até ser despertado por outros threads por meio de notify() ou notifyAll. Este método só pode ser chamado dentro de um método sincronizado. Se o thread atual não for o detentor do bloqueio, esse método lançará uma IllegalMonitorStateException.
void wait(long milis) e void wait(long milis,int nanos)
Faz com que o thread entre em um estado de espera até ser notificado ou até que o tempo especificado decorra. Esses métodos só podem ser chamados em métodos sincronizados. Se o thread atual não for o detentor do bloqueio, esse método lançará uma IllegalMonitorStateException.
Object.wait(), Object.notify() e Object.notifyall() devem ser escritos dentro do método sincronizado ou dentro do bloco sincronizado. Isso ocorre porque esses métodos exigem que o thread atualmente executando o método object.wait() possua o. objeto. Mesmo se você tiver certeza de que o thread de contexto atual possui o bloqueio do objeto, não poderá escrever instruções como object.wait() no contexto atual. como:
Copie o código do código da seguinte forma:
pacote edu.sjtu.erplab.ObjectTest;
classe A
{
público sincronizado void printThreadInfo() lança InterruptedException
{
Tópico t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
classe pública ObjectWaitTest {
público estático void principal(String args[])
{
A = novo A();
//Como o método printThreadInfo() lança InterruptedException, um bloco try-catch deve ser usado aqui.
tentar {
a.printThreadInfo();
a.wait();
} catch (InterruptedException e) {
// TODO Bloco catch gerado automaticamente
e.printStackTrace();
}
}
}
Um erro será relatado quando o programa for executado e os resultados são os seguintes:
ThreadID:1, ThreadName:principal
Exceção no thread “main” java.lang.IllegalMonitorStateException
em java.lang.Object.wait (método nativo)
em java.lang.Object.wait(Object.java:485)
em edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
A maneira correta de escrevê-lo deveria ser
Copie o código do código da seguinte forma:
pacote edu.sjtu.erplab.ObjectTest;
classe A
{
público sincronizado void printThreadInfo() lança InterruptedException
{
Tópico t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait(); //Continue esperando
this.wait(1000); //Aguarde 1000ms
// super.wait(1000);
}
}
classe pública ObjectWaitTest {
público estático void principal(String args[])
{
A = novo A();
//Como o método printThreadInfo() lança InterruptedException, um bloco try-catch deve ser usado aqui.
tentar {
a.printThreadInfo();
//a.wait();
} catch (InterruptedException e) {
// TODO Bloco catch gerado automaticamente
e.printStackTrace();
}
Tópico t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}