"¡Hola, amigo!"

"Ahora les contaré un poco sobre los métodos de dormir, ceder y unirse".

"Eso es aburrido. Acabo de encontrar una pregunta de entrevista: '¿Cuál es la diferencia entre los métodos yield (), sleep () y wait ()?'. ¿Puedes explicar eso?"

"No hay problema. En primer lugar, estos son tres métodos completamente diferentes".

1) dormir (tiempo de espera)  : detiene el hilo actual (en el que se llamó a dormir) durante la cantidad de milisegundos indicados por el parámetro de tiempo de espera. Luego, el subproceso pasa al estado TIMED_WAITING. El método puede finalizar antes si se establece el indicador isInterrupted.

Ejemplo Descripción
Thread.sleep(500);
El subproceso actual suspende su propia ejecución durante 500 milisegundos o 0,5 segundos.

2) yield()  – el subproceso actual 'salta su turno'. El subproceso pasa del estado de ejecución al estado listo y la JVM continúa con el siguiente subproceso. Los estados de ejecución y listo son subestados del estado RUNNABLE .

Ejemplo Descripción
Thread.yield();
El subproceso actual "se salta su turno" y Java cambia inmediatamente al siguiente subproceso.

3) espera (tiempo de espera)  : esta es una versión del método de espera (), pero con un tiempo de espera. "El método de espera solo se puede llamar dentro de un bloque sincronizado en un objeto mutex bloqueado por el subproceso actual. De lo contrario, el método arroja una excepción Illegal MonitorState .

"Llamar a este método hace que se libere el bloqueo del objeto mutex, lo que lo hace disponible para que lo adquiera otro subproceso. Además, el subproceso entra en el estado ESPERA (para el método de espera () sin parámetros) o el estado TIMED_WAITING (para la espera (tiempo de espera) ) método)."

Ejemplo Descripción
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Cuando se llama al método de espera, el subproceso actual libera el bloqueo del objeto del monitor y duerme durante 500 milisegundos. El objeto monitor puede ser adquirido por otro subproceso.
Después de 500 milisegundos, el subproceso se activará y, si el monitor no está ocupado, el subproceso lo adquirirá y seguirá funcionando.
Si el monitor está bloqueado por otro subproceso, el subproceso actual cambiará al estado BLOQUEADO.

4) unirse (tiempo de espera)

"Este método no estaba en su pregunta, pero está en mi plan de lección, así que le contaré sobre él. Cuando llama al método join() o join(timeout), el subproceso actual se 'adjunta' al subproceso que llamó a este método. El subproceso actual se va a dormir y espera hasta que finaliza el subproceso al que está unido (es decir, el subproceso cuyo método join() fue llamado)".

"El subproceso actual entra en el estado ESPERANDO para el método join() y en el estado TIMED_WAITING para el método join(timeout)".

Ejemplo Descripción
Thread thread = getWorkThread();
thread.join(500);
El subproceso actual se unirá al subproceso workerThread y esperará a que finalice.
Pero se 'separará' después de 500 milisegundos y continuará ejecutándose.

"El tiempo de espera en los métodos de espera (tiempo de espera) y unión (tiempo de espera) significa que el método se duerme y espera algo, pero no más que el tiempo de espera dado en milisegundos. Luego se despierta".

"Parece que lo único que estos métodos tienen en común es el tiempo de espera. Hacen cosas completamente diferentes".

"Sí, eso es correcto".