sleep () es un método que se utiliza para retener el proceso durante unos segundos o el tiempo que desea, pero en caso de que el hilo de método wait () pase al estado de espera y no volverá automáticamente hasta que llamemos a notify () o notifique a todos ().
La principal diferencia es que wait () libera el bloqueo o monitor mientras sleep () no libera ningún bloqueo o monitor mientras espera. La espera se usa para la comunicación entre subprocesos, mientras que la suspensión se usa para introducir la pausa en la ejecución, generalmente.
Thread.sleep () envía el hilo actual al estado "No ejecutable" durante cierto tiempo. El hilo mantiene los monitores que ha adquirido, es decir, si el hilo está actualmente en un bloque o método sincronizado, ningún otro hilo puede ingresar a este bloque o método. Si otro hilo llama a t.interrupt () despertará el hilo dormido. Tenga en cuenta que dormir es un método estático, lo que significa que siempre afecta al hilo actual (el que está ejecutando el método de suspensión). Un error común es llamar a t.sleep () donde t es un hilo diferente; incluso entonces, es el hilo actual el que dormirá, no el hilo t.
object.wait () envía el hilo actual al estado "No ejecutable", como sleep (), pero con un giro. Wait se llama en un objeto, no en un hilo; llamamos a este objeto el "objeto de bloqueo". Antes de llamar a lock.wait (), el hilo actual debe sincronizarse en el objeto de bloqueo; wait () luego libera este bloqueo y agrega el hilo a la "lista de espera" asociada con el bloqueo. Más tarde, otro hilo puede sincronizarse en el mismo objeto de bloqueo y llamar a lock.notify (). Esto despierta el hilo de espera original. Básicamente, wait () / notify () es como sleep () / interrupt (), solo el hilo activo no necesita un puntero directo al hilo dormido, sino solo al objeto de bloqueo compartido.
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
LOCK.wait(); // LOCK is not held
}
Deje categorizar todos los puntos anteriores:
Call on:
- Espere(): llama a un objeto; El subproceso actual debe sincronizarse en el objeto de bloqueo.
- sleep (): llama a un hilo; siempre ejecutando hilo actualmente.
Synchronized:
- Espere(): cuando varios hilos sincronizados acceden al mismo objeto uno por uno.
- sleep (): cuando se sincronizan varios subprocesos, espere el reposo del subproceso de dormir.
Hold lock:
- Espere(): suelta el bloqueo para que otros objetos tengan la oportunidad de ejecutarse.
- sleep (): mantenga el bloqueo durante al menos t veces si se especifica el tiempo de espera o alguien interrumpe.
Wake-up condition:
- Espere(): hasta que la llamada notifique (), notifique a Todos () desde el objeto
- sleep (): hasta que caduque al menos el tiempo o llame a interrupt ().
Usage:
- dormir(): para sincronización horaria y;
- wait (): para sincronización multihilo.
Ref: diff sleep
ywait