Los métodos esperar, notificar y notificar a todos son los métodos nativos finales de la clase Objeto. Por lo tanto, estos métodos no pueden ser anulados por subclases. La clase Objeto es la superclase de todas las clases, por lo que existen las siguientes tres formas de llamar a métodos de espera y otros en el programa.
Copie el código de código de la siguiente manera:
esperar();//Método 1:
this.wait();//Método 2:
super.wait();//Método 3
anular notificar a todos()
Desbloquea todos los hilos que llaman al método de espera en este objeto. Este método solo se puede llamar dentro de un método sincronizado o bloque sincronizado. Si el hilo actual no es el titular del bloqueo, este método genera una excepción IllegalMonitorStateException.
notificación nula()
Seleccione aleatoriamente un hilo que llame al método de espera en el objeto para desbloquearlo. Este método solo se puede llamar dentro de un método sincronizado o bloque sincronizado. Si el hilo actual no es el titular del bloqueo, este método genera una excepción IllegalMonitorStateException.
espera nula()
Hace que el subproceso entre en un estado de espera hasta que otros subprocesos lo despierten mediante notify() o notifyAll. Este método solo se puede llamar dentro de un método sincronizado. Si el hilo actual no es el titular del bloqueo, este método genera una IllegalMonitorStateException.
espera nula (millis largos) y espera nula (millis largos, int nanos)
Hace que el hilo entre en un estado de espera hasta que se le notifica o transcurre el tiempo especificado. Estos métodos solo se pueden llamar dentro de métodos sincronizados. Si el hilo actual no es el titular del bloqueo, este método genera una IllegalMonitorStateException.
Object.wait(), Object.notify() y Object.notifyall() deben escribirse dentro del método sincronizado o dentro del bloque sincronizado. Esto se debe a que estos métodos requieren que el subproceso que actualmente ejecuta el método object.wait() sea propietario del. objeto bloqueo de objeto. Incluso si está seguro de que el hilo del contexto actual posee el bloqueo del objeto, no puede escribir declaraciones como object.wait() en el contexto actual. como:
Copie el código de código de la siguiente manera:
paquete edu.sjtu.erplab.ObjectTest;
clase A
{
printThreadInfo() vacío sincronizado público lanza InterruptedException
{
Hilo t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
clase pública ObjectWaitTest {
principal vacío estático público (argumentos de cadena [])
{
A a=nueva A();
// Debido a que el método printThreadInfo () arroja InterruptedException, aquí se debe usar un bloque try-catch.
intentar {
a.printThreadInfo();
esperar();
} captura (Excepción interrumpida e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
}
}
Se informará un error cuando se ejecute el programa y los resultados serán los siguientes:
ID de hilo: 1, Nombre de hilo: principal
Excepción en el hilo "principal" java.lang.IllegalMonitorStateException
en java.lang.Object.wait (método nativo)
en java.lang.Object.wait(Object.java:485)
en edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
La forma correcta de escribirlo debería ser
Copie el código de código de la siguiente manera:
paquete edu.sjtu.erplab.ObjectTest;
clase A
{
printThreadInfo() vacío sincronizado público lanza InterruptedException
{
Hilo t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait(); //Sigue esperando
this.wait(1000);//Esperar 1000ms
// super.espera(1000);
}
}
clase pública ObjectWaitTest {
principal vacío estático público (argumentos de cadena [])
{
A a=nueva A();
// Debido a que el método printThreadInfo () arroja InterruptedException, aquí se debe usar un bloque try-catch.
intentar {
a.printThreadInfo();
//esperar();
} captura (Excepción interrumpida e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
Hilo t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}