2012-03-14 11 views
43

Como se está ejecutando actualmente hilo, mientras que encuentra la llamada [sleep][1](); luego pase mueve inmediatamente en estado durmiendo en tanto que para [yield][2](); hilo se mueve en estado estado ejecutable/listo¿Cuál es la diferencia entre el método de suspensión y el método de producción de multi threading?

+1

¿Qué dice su javadoc? –

+1

Regla de oro: 1) nunca use 'yield()'; 2) use 'sleep()' solo cuando el programa sea * explícitamente * requerido para esperar la cantidad de tiempo especificada (si solo necesita "esperar un poco", la mayoría de las veces es que lo está haciendo mal y necesita implementar un mecanismo de espera/señalización adecuado). –

Respuesta

78

sleep() hace que el hilo deje de ejecutarse definitivamente durante un período de tiempo dado; si no se necesita ejecutar otro hilo o proceso, la CPU estará inactiva (y probablemente ingrese en un modo de ahorro de energía).

yield() básicamente significa que el hilo no está haciendo nada particularmente importante y si es necesario ejecutar otros hilos o procesos, deberían hacerlo. De lo contrario, el hilo actual continuará ejecutándose.

117

Podemos prevenir un hilo de ejecución mediante el uso de cualquiera de los 3 métodos de la clase Thread:

  1. yield()
  2. join()
  3. sleep()
  1. yield() método se detiene el hilo que se está ejecutando temporalmente para dar una oportunidad a los hilos esperando restantes de la misma prioridad a ejecutar. Si no hay un hilo en espera o si todos los hilos en espera tienen una prioridad inferior, el mismo hilo continuará su ejecución. El programador de subprocesos cuyo comportamiento depende del proveedor decide el hilo producido cuando tendrá la posibilidad de ejecución.

  2. join() Si cualquier subproceso en ejecución t1 llama join() en t2 es decir; t2.join() inmediatamente t1 entrará en estado de espera hasta que t2 complete su ejecución.

  3. sleep() De acuerdo con nuestro requisito, podemos hacer que un hilo esté en estado dormido durante un período de tiempo específico (espero que no se requiera mucha explicación para nuestro método favorito).

+2

También esperando en algún objeto de sincronización como un mutex. – Nick

+0

buena explicación, gracias Anantha. – Amit

3

sueño causa hilo a suspender en sí para x milisegundos mientras que el rendimiento suspende el hilo e inmediatamente lo mueve a la cola de preparados (la cola de la cual la CPU utiliza para ejecutar subprocesos).

27

Sleep() hace que el subproceso que se está ejecutando se ponga en suspensión (suspenda temporalmente la ejecución).

Yield() hace que el objeto de subproceso que se está ejecutando se detenga temporalmente y permita que se ejecuten otros subprocesos.

enter image description here

Leer this para una buena explicación del tema.

+12

Hay un error en este flujo: del estado Dormir al Ready-to-run usamos interrupt() en lugar de notify() y notifyAll() – NguyenDat

+1

buen cuadro en flujo de hilo. – Mdhar9e

+0

buen gráfico, me ayuda a comprender el ciclo de vida del hilo más profundo y claro. – Amit

0

sleep() hace que el hilo deje de ejecutarse definitivamente durante un tiempo determinado; si no se necesita ejecutar otro hilo o proceso, la CPU estará inactiva (y probablemente ingrese en un modo de ahorro de energía). yield() básicamente significa que el subproceso no está haciendo algo particularmente importante y si se deben ejecutar otros subprocesos o procesos, deberían hacerlo. De lo contrario, el hilo actual continuará ejecutándose.

Consulte http://preciselyconcise.com/java/concurrency/b_sleep.php

5

Rendimiento: hará hilo que esperar a que el hilo se está ejecutando actualmente y el hilo que ha llamado yield() se adhiere al final de la ejecución del hilo. El hilo que llama yield() estará en estado bloqueado hasta su turno.

sueño: hará que el hilo a dormir en modo de reposo durante espacio de tiempo mencionado en argumentos.

Ingreso: t1 y t2 son dos hilos, t2.join() se llama entonces T1 entre en estado de espera hasta que se completa la ejecución t2. Entonces t1 pasará al estado ejecutable, luego nuestro programador especializado de hilos JVM elegirá t1 en función de los criterios.

1

Rendimiento: Es una pista (no guarenteed) al programador que ha hecho lo suficiente y que algún otro flujo de misma prioridad podría ejecutar y utilizar la CPU.

Thread.sleep();

sueño: Bloquea la ejecución de ese hilo en particular por un tiempo determinado.

TimeUnit.MILLISECONDS.sleep (1000);

Cuestiones relacionadas