"¡Hola, amigo!"

"¡Hola, Rishi!"

"Voy a presentarle los métodos de espera , notificación y notificación a todos de la clase Objeto".

"Hoy solo nos familiarizaremos con ellos, pero volveremos más tarde y dedicaremos más tiempo a esto".

"Bueno."

"Estos métodos se inventaron como parte del mecanismo de sincronización de subprocesos".

"Permítanme recordarles que Java tiene un mecanismo incorporado para controlar el acceso a recursos compartidos (objetos) desde diferentes subprocesos. Un subproceso puede declarar que un objeto está ocupado y otros subprocesos tendrán que esperar hasta que se libere el objeto ocupado. "

"Lo recuerdo. Lo haces usando la palabra clave sincronizada ".

"Correcto. Por lo general, el código se vería así:"

public void print()
{
 Object monitor = getMonitor();
 synchronized(monitor)
 {
  System.out.println("text");
 }
}

"¿Recuerdas cómo funciona eso?"

"Sí. Si dos subprocesos llaman simultáneamente al método print(), uno de ellos ingresará al bloque etiquetado como sincronizado y bloqueará el monitor, lo que hace que el segundo subproceso espere hasta que se libere el monitor".

"Correcto. Una vez que un subproceso ingresa al bloque etiquetado como sincronizado, el objeto del monitor se marca como ocupado y otros subprocesos se verán obligados a esperar a que se libere el objeto del monitor. El mismo objeto del monitor se puede usar en varias partes del programa. "

"Por cierto, ¿por qué elegiste el nombre monitor?"

"Un monitor es lo que suele llamarse un objeto que almacena el estado ocupado o libre".

"Y aquí es donde entran en juego los métodos de esperar y notificar ".

"En realidad, estos son realmente los únicos dos métodos. Los otros son solo adaptaciones de estos métodos".

"Ahora analicemos qué es el método de espera y por qué lo necesitamos " .

"A veces hay situaciones en un programa en las que un subproceso ingresa un bloque de código sincronizado y bloquea el monitor, pero no puede continuar porque le faltan algunos datos. Por ejemplo, un archivo que debe procesar no ha terminado de descargarse o algo como eso."

"Podríamos simplemente esperar a que se descargue el archivo. Podrías simplemente verificarlo usando un bucle. Si el archivo aún no se ha descargado, entonces duerme por un segundo más o menos y vuelve a verificar hasta que se descargue".

"Algo como esto:"

while(!file.isDownloaded())
{
 Thread.sleep(1000);
}
processFile(file);

"Pero en nuestro caso, este tipo de espera es demasiado costoso. Dado que nuestro subproceso bloqueó el monitor, otros subprocesos también se ven obligados a esperar, aunque es posible que ya tengan los datos que necesitan".

"El método wait() se inventó para resolver este problema. Este método hace que el subproceso libere el monitor y luego "suspenda" el subproceso.

"Solo puede llamar al método de espera de un objeto de monitor cuando el monitor está ocupado, es decir, solo dentro de un bloque sincronizado . Cuando esto sucede, el subproceso deja de ejecutarse temporalmente y el monitor se libera para que otros subprocesos puedan usarlo".

"A menudo hay instancias en las que un subproceso ingresará a un bloque sincronizado y llamará en espera, liberando así el monitor".

"Luego entrará un segundo hilo y se suspenderá, luego un tercero, y así sucesivamente".

"¿Y cómo se reanuda un hilo?"

"Para eso, hay un segundo método: notificar".

"Solo puede llamar a los métodos de notificación / notificación de un objeto de monitor cuando el monitor está ocupado, es decir, solo dentro de un bloque sincronizado . El método de notificación activa todos los subprocesos que están esperando en este objeto de monitor".

"El método de notificación 'descongela' un subproceso aleatorio, pero el método de notificación a todos descongela todos los subprocesos "congelados" de este monitor".

"Muy interesante. Gracias, Rishi".

"También hay adaptaciones del método wait():"

método esperar () Explicación
void wait(long timeout)
El hilo se "congela", pero se "descongela" automáticamente después de esperar la cantidad de milisegundos que se pasan al método como argumento.
void wait(long timeout, int nanos)
El hilo se "congela", pero se "descongela" automáticamente después de esperar el número de nanosegundos pasados ​​al método como argumento.

"También llamamos a esto una espera con un tiempo de espera. El método funciona como una espera normal, pero si ha pasado el tiempo especificado y el hilo no se ha activado, se activa solo".