Pregunta Diferencia entre esperar () y dormir ()


¿Cuál es la diferencia entre un wait() y sleep() en hilos?

Entiendo que un wait()-ing El subproceso todavía está en modo de ejecución y utiliza ciclos de CPU, pero una sleep()-ing no consume ningún ciclo de CPU correcto?

Por qué tenemos ambos  wait() y sleep(): ¿cómo varía su implementación en un nivel inferior?


1026
2018-06-24 06:48


origen


Respuestas:


UN wait puede ser "despertado" por otro hilo llamado notify en el monitor que se espera mientras que una sleep no poder. También un wait (y notify) debe suceder en un bloque synchronized en el objeto del monitor, mientras que sleep no:

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

En este punto, el hilo que se está ejecutando actualmente espera y libera el monitor. Otro hilo puede hacer

synchronized (mon) { mon.notify(); }

(En el mismo mon objeto) y el primer hilo (suponiendo que es el único hilo esperando en el monitor) se activará.

También puedes llamar notifyAll si hay más de un hilo esperando en el monitor, se activará todos ellos. Sin embargo, solo uno de los hilos podrá agarrar el monitor (recuerde que el wait está en un synchronized bloquear) y continuar - los otros serán bloqueados hasta que puedan adquirir el bloqueo del monitor.

Otro punto es que llamas wait en Object sí mismo (es decir, espera en el monitor de un objeto) mientras llama sleep en Thread.

Otro punto es que puedes obtener despertares espurios de wait (es decir, el hilo que está esperando se reanuda sin motivo aparente). Debieras siempre wait mientras gira sobre alguna condición como sigue:

synchronized {
    while (!condition) { mon.wait(); }
}

739
2018-06-24 06:50



Una diferencia clave que aún no se menciona es que mientras duerme un subproceso no no libera los bloqueos que tiene, mientras espera libera el bloqueo en el objeto que wait() es llamado.

synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}


synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}

285
2018-06-24 07:06



encontré este enlace útil (qué referencias esta publicación) Pone la diferencia entre sleep(), wait()y yield() en términos humanos. (en caso de que los enlaces se agoten, he incluido la publicación a continuación con marcado adicional)

Todo finalmente hace su camino hacia el programador del sistema operativo, que   reparte timeslices a procesos e hilos.

sleep(n) dice "He terminado con mi horario de verano, y por favor no me des   otro durante al menos n milisegundos ". El sistema operativo ni siquiera intenta   programe el hilo de dormir hasta que haya pasado el tiempo solicitado.

yield() dice "Ya terminé con el intervalo de tiempo, pero aún tengo trabajo para   hacer." El sistema operativo es libre de darle inmediatamente al hilo otro timeslice,   o para dar algún otro hilo o procesar la CPU el hilo de rendimiento   simplemente se rindió.

.wait() dice "Terminé con mi timeslice. No me des otro   intervalo de tiempo hasta que alguien llame a notify () ". Al igual que con sleep(), el sistema operativo no   incluso intente programar su tarea a menos que alguien llame notify() (o uno de   algunos otros escenarios de activación ocurren).

Los subprocesos también pierden el resto de sus tiempos de espera cuando actúan   bloqueando IO y bajo algunas otras circunstancias. Si un hilo funciona   a través de todo el intervalo de tiempo, el SO toma el control a la fuerza aproximadamente   Si yield()ha sido llamado, para que puedan ejecutarse otros procesos.

Raramente necesitas yield(), pero si tienes una aplicación de cálculo pesado   límites de tareas lógicas, insertando un yield()  podría mejorar el sistema   capacidad de respuesta (a expensas del tiempo - interruptores de contexto, incluso solo   al sistema operativo y de vuelta, no son gratis). Mida y pruebe contra metas que usted   cuidado, como siempre.


198
2017-08-05 19:32



Aquí hay muchas respuestas, pero no pude encontrar la distinción semántica mencionada en ninguna.

No se trata del hilo en sí mismo; Ambos métodos son necesarios ya que admiten casos de uso muy diferentes.

sleep() envía el subproceso para que duerma como estaba antes, solo empaqueta el contexto y deja de ejecutarse durante un tiempo predefinido. Entonces, para despertarlo antes del tiempo debido, necesita conocer la referencia del hilo. Esta no es una situación común en un entorno de subprocesos múltiples. Se utiliza principalmente para sincronizar el tiempo (por ejemplo, despertar en exactamente 3,5 segundos) y / o equidad codificada (simplemente duerma un rato y deje que otros hilos funcionen).

wait(), por el contrario, es un mecanismo de sincronización de subprocesos (o mensajes) que le permite notificar a un subproceso del que no tiene referencia almacenada (ni le importa). Puede pensarlo como un patrón de publicación y suscripción (wait == suscribirse y notify() == publicar). Básicamente, utilizando notify () está enviando un mensaje (que incluso podría no recibirse y normalmente no le importa).

Para resumir, normalmente usas sleep() para sincronización de tiempo y wait() para la sincronización de múltiples hilos.

Podrían implementarse de la misma manera en el sistema operativo subyacente, o no funcionar (ya que las versiones anteriores de Java no tenían multiprocesamiento real, probablemente algunas máquinas virtuales pequeñas tampoco lo hacen). No se olvide de que Java se ejecuta en una VM, por lo que su código se transformará en algo diferente según la VM / OS / HW en la que se ejecute.


64
2018-04-19 10:38



Aquí, he enumerado algunas diferencias importantes entre wait() y sleep() métodos.
PD:  También haga clic en los enlaces para ver el código de la biblioteca (trabajo interno, simplemente juegue un poco para una mejor comprensión). 

Espere()

  1. wait() método libera el bloqueo.
  2. wait() es el método de Object clase.
  3. wait() es el método no estático - public final void wait() throws InterruptedException { //...}
  4. wait() debe ser notificado por notify() o notifyAll() métodos.
  5. wait() El método debe llamarse desde un bucle para tratar la falsa alarma.

  6. wait() el método debe invocarse desde el contexto sincronizado (es decir, el método o el bloque sincronizados); de lo contrario, arrojará IllegalMonitorStateException

dormir()

  1. sleep() método no libera el bloqueo.
  2. sleep() es el método de java.lang.Thread clase.
  3. sleep() es el método estático - public static void sleep(long millis, int nanos) throws InterruptedException { //... }
  4. después de la cantidad de tiempo especificada, sleep() esta completado.
  5. sleep() es mejor no llamar desde el bucle (es decir. ver el código a continuación)
  6. sleep() puede ser llamado desde cualquier lugar. no hay un requisito específico.

Árbitro: Diferencia entre esperar y dormir

Fragmento de código para llamar al método de espera y suspensión

synchronized(monitor){
    while(condition == true){ 
        monitor.wait()  //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep    
}

thread transition to different thread states


43
2017-12-28 06:18



Hay algunas notas clave de diferencia que concluyo después de trabajar en esperar y dormir, primero eche un vistazo a la muestra usando wait () y sleep ():

Ejemplo 1: utilizando Espere() y dormir():

synchronized(HandObject) {
    while(isHandFree() == false) {
        /* Hand is still busy on happy coding or something else, please wait */
        HandObject.wait();
    }
}

/* Get lock ^^, It is my turn, take a cup beer now */
while (beerIsAvailable() == false) {
    /* Beer is still coming, not available, Hand still hold glass to get beer,
       don't release hand to perform other task */
    Thread.sleep(5000);
}

/* Enjoy my beer now ^^ */
drinkBeers();

/* I have drink enough, now hand can continue with other task: continue coding */
setHandFreeState(true);
synchronized(HandObject) {
    HandObject.notifyAll();
}

Deje que la claridad algunas notas clave:

  1. Recurrir:
    • wait (): invocar el hilo actual que contiene el Objeto HandObject
    • sleep (): Call on Thread ejecuta la tarea get beer (es un método de clase así que afecta al hilo en ejecución)
  2. Sincronizado:
    • wait (): cuando se sincroniza el acceso a múltiples hilos del mismo objeto (HandObject) (cuando se necesita comunicación entre más de un hilo (thread ejecuta codificación, thread ejecuta get beer) accede al mismo objeto HandObject)
    • sleep (): cuando se espera la condición para continuar la ejecución (Waiting beer available)
  3. Mantenga el bloqueo:
    • wait (): libera el bloqueo para que otro objeto tenga chance de ejecutarse (HandObject es gratis, puedes hacer otro trabajo)
    • sleep (): mantenga el bloqueo al menos t veces (o hasta que se interrumpa) (Mi trabajo aún no finaliza, sigo manteniendo el bloqueo y esperando alguna condición para continuar)
  4. Despertar:
    • wait (): hasta llamar a notify (), notifyAll () desde el objeto
    • sleep (): hasta que al menos el tiempo expire o call interrupt
  5. Y el último punto es usar cuando como estani indicar:

normalmente usa sleep () para sincronización de tiempo y wait () para   sincronización multihilo.

Por favor corrígeme si estoy equivocado.


28
2018-05-19 06:59



Diferencia entre esperar () y dormir ()

  • La diferencia fundamental es wait() es desde Object y sleep() es un método estático de Thread.

  • La principal diferencia es que wait() libera el bloqueo mientras sleep() no libera ningún bloqueo mientras espera.

  • los wait() se utiliza para la comunicación entre hilos mientras sleep() se usa para introducir pausa en la ejecución, generalmente.

  • los wait() debe llamar desde adentro sincronizar o de lo contrario obtenemos IllegalMonitorStateException  mientras sleep()  puede llamar a cualquier parte

  • Para iniciar el hilo de nuevo desde wait(), tienes que llamar notify() o notifyAll(). Mientras en sleep(), el hilo se inicia después del intervalo especificado de ms / seg.

Similitudes que ayudan a entender

  • Ambos hacen que el hilo actual entre en el No ejecutable estado.
  • Ambos son native métodos.

21
2017-07-24 06:48



Esta es una pregunta muy simple, porque ambos métodos tienen un uso totalmente diferente.

La principal diferencia es esperar para liberar el candado o monitor mientras Sleep no suelta ningún candado o monitor mientras espera. Wait se utiliza para la comunicación entre hilos mientras que Sleep se usa para introducir pausa en la ejecución. 

Esta fue solo una explicación clara y básica, si quieres más que eso, continúa leyendo.

En caso de wait() El hilo del método entra en estado de espera y no volverá automáticamente hasta que llamemos al notify() método (o notifyAll() si tiene más de un hilo en estado de espera y desea activar todos esos hilos). Y necesita bloqueo sincronizado u objeto o bloqueo de clase para acceder al wait() o notify() o notifyAll() métodos. Y una cosa más, el wait() El método se usa para la comunicación entre hilos porque si un hilo entra en estado de espera, necesitará otro hilo para activarlo.

Pero en caso de sleep() este es un método que se utiliza para mantener el proceso durante unos segundos o el tiempo que deseaba. Porque no necesitas provocar ningún notify() o notifyAll() método para recuperar ese hilo. O no necesita ningún otro hilo para recuperar ese hilo. Como si quisieras que algo ocurriera después de unos segundos, como en un juego después del turno del usuario, quieres que el usuario espere hasta que la computadora se reproduzca, entonces puedes mencionar el sleep() método.

Y una diferencia más importante que se pregunta a menudo en las entrevistas: sleep() pertenece a Thread clase y wait() pertenece a Object clase.

Estas son todas las diferencias entre sleep() y wait().

Y existe una similitud entre ambos métodos: ambos son enunciados verificados, por lo que es necesario intentar capturar o lanzar para acceder a estos métodos.

Espero que esto ayude.


18
2018-04-19 07:02



fuente : http://www.jguru.com/faq/view.jsp?EID=47127

Thread.sleep() envía el hilo actual al "No ejecutable" estado   por una cierta cantidad de tiempo El hilo mantiene los monitores que ha adquirido   - es decir, si el hilo se encuentra actualmente en un bloque o método sincronizado, ningún otro hilo puede ingresar a este bloque o método. Si otro hilo llama t.interrupt() despertará el hilo de dormir.

Tenga en cuenta que dormir es un método estático, lo que significa que siempre afecta   el hilo actual (el que está ejecutando el método de suspensión). UN   error común es llamar t.sleep() donde t es un hilo diferente;   incluso entonces, es el hilo actual el que duerme, no el hilo t.

t.suspend() es obsoleto. Usarlo es posible detener un hilo diferente   que el hilo actual. Un hilo suspendido mantiene todos sus monitores y   como este estado no es interrumpible, es un punto muerto.

object.wait() envía el hilo actual al "No ejecutable" estado,   me gusta sleep(), pero con un giro Se invoca a un objeto, no a un   hilo; llamamos a este objeto el "objeto de bloqueo". antes de lock.wait() es   llamado, el hilo actual debe sincronizarse en el objeto de bloqueo; wait()   luego libera este bloqueo y agrega el hilo a la "lista de espera"   asociado con el bloqueo. Más tarde, otro hilo se puede sincronizar en el   mismo objeto de bloqueo y llamada lock.notify(). Esto despierta el original,   hilo de espera. Básicamente, wait()/notify() es como    sleep()/interrupt(), solo el hilo activo no necesita un directo   puntero al hilo que duerme, pero solo al objeto de bloqueo compartido.


16
2017-11-05 03:34



Esperar y dormir son dos cosas diferentes:

  • En sleep() el hilo deja de funcionar durante la duración especificada.
  • En wait() el hilo deja de funcionar hasta que se notifica el objeto que se espera, generalmente por otros hilos.

14
2018-06-24 06:53



sleep es un método de Thread, wait es un método de Object, asi que wait/notify es una técnica de sincronización de datos compartidos en Java (usando monitor), pero sleep es un método simple de hilo para pausarse.


10
2017-10-30 22:46