En línea IDE de Java sugerencia de los estados, «la Invocación de Hilo.dormir en el bucle puede causar problemas de rendimiento.» No puedo encontrar aclaración en el resto de la documentación re. esta instrucción.

¿Por qué? Cómo? ¿Qué otro método podría no ser para retrasar la ejecución de un hilo?

  • Tal vez usted podría cambiar la pregunta para aclarar que en realidad es una advertencia de algunos IDE….como «Que problema de rendimiento podrían ser destinados por ‘la Invocación …’?»
InformationsquelleAutor fcw | 2010-10-18

8 Comentarios

  1. 35

    No es que Thread.sleep en un bucle en sí es un problema de rendimiento, pero normalmente es un indicio de que usted está haciendo algo mal.

    while(! goodToGoOnNow()) {
       Thread.sleep(1000);
    }

    Uso Thread.sleep sólo si desea suspender su hilo para una cierta cantidad de tiempo. No lo use si usted desea esperar para una determinada condición.

    Para esta situación, usted debe utilizar wait/notify lugar o algunas de las construcciones en la concurrencia utils paquetes.

    De votación con Thread.sleep debe ser utilizado sólo cuando la espera de condiciones externas a la actual de la JVM (por ejemplo, espera hasta que otro proceso ha escrito un archivo).

    • Gracias por las respuestas. El hilo se está comunicando a través de TCP a una pieza de equipo, a la espera para empezar a correr:
    • El protocolo es, Está en ejecución? No. Sueño….. Están en ejecución? No. Dormir… Está en ejecución? Sí. Seguir…. Así que no hay problema. Thx!
    • No olvides que la InterruptedException.
  2. 6

    Depende de si la espera es dependiente de otro hilo de terminar el trabajo, en cuyo caso se debe utilizar vigilado bloques, o alto nivel de concurrencia a clases introdujo en Java 1.6. Hace poco he tenido que corregir algunos CircularByteBuffer código que utiliza Hilo duerme en lugar de custodiada bloques. Con el método anterior, no había manera de garantizar la adecuada concurrencia. Si sólo quieres el hilo a dormir como un juego, en el núcleo de bucle de juego para detener la ejecución de una cierta cantidad de tiempo, de modo que con los hilos tienen buen periodo en el que se ejecuta, Thread.sleep(..) está perfectamente bien.

  3. 5

    Depende del motivo por el que usted está poniendo a dormir y con qué frecuencia se ejecuta.

    Puedo pensar en varias alternativas que podrían aplicar en diferentes situaciones:

    • Deje que el hilo de morir y empezar uno nuevo más tarde (en la creación de hilos puede ser muy caro)
    • Uso De Hilo.join() para esperar a otro hilo a morir
    • Uso De Hilo.yield() para permitir que otro hilo para ejecutar
    • Deje que el hilo de ejecución, pero establece a un menor prioridad
    • Uso wait() y notify()
  4. 3

    http://www.jsresources.org/faq_performance.html

    1.6. Qué precisión se puede esperar de Hilo.sleep()?

    El problema fundamental con el corto duerme es que una llamada a dormir termina la programación actual periodo de tiempo. Sólo después de que todos los demás subprocesos/proceso terminado, la llamada puede devolver.

    Para el Sun JDK, Hilo de rosca.sleep(1) se informó a ser bastante preciso en Windows. Para Linux, depende del temporizador de interrupción del kernel. Si el kernel está compilado con HZ=1000 (el valor predeterminado en alfa), la precisión se informó a ser buena. Para HZ=100 (el valor predeterminado en x86) normalmente duerme durante 20 ms.

    El Uso De Hilo.el sueño(millis, nanos) no mejora los resultados. En el Sun JDK, el nanosegundo valor es sólo redondeado a la milésima de segundo más cercano. (Matías)

  5. 2

    ¿por qué? esto es debido a que el cambio de contexto (parte del sistema operativo de la CPU de programación)

    ¿Cómo? Subproceso de llamada.el sueño(t) hace que el subproceso actual para ser trasladado desde la ejecución de la cola de la cola de espera. Después de que el tiempo ‘t’ llegó el subproceso actual movidos de la cola de espera a la cola listo y, a continuación, toma algún tiempo para ser escogido por el CPU y en funcionamiento.

    Solución: llamar a Hilo.el sueño(t*10); en lugar de llamar a Hilo.El sueño(t) dentro de un bucle de 10 iteraciones …

  6. 1

    Tengo cara de este problema antes de cuando se espera para el proceso asincrónico para devolver un resultado.

    Hilo.el sueño es un problema multi hilo escenario. Tiende a queda dormido. Esto es debido a que internamente reorganizar su prioridad y se produce a otros procesos de larga ejecución (thread).

    Un nuevo enfoque es el uso de ScheduledExecutorService interfaz o el ScheduledThreadPoolExecutor introducir en java 5.

    Referencia: http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html

  7. 1

    Podría NO ser un problema, depende.

    En mi caso, yo uso Hilo.sleep() para esperar un par de segundos antes de que otro intento de volver a conectar a un proceso externo. Tengo un bucle while para que este vuelva a conectar la lógica hasta que se alcanza el máximo número de intentos. Así que en mi caso, el Hilo.sleep() es puramente para el cronometraje de propósito y no de coordinación entre multithreads, es perfectamente correcto.

    Usted puede configurar el IDE en cómo esta advertencia debe ser manejado.

  8. 0

    Sugiero mirar en el CountDownLatch clase. Hay muy pocos ejemplos triviales por ahí en línea. Cuando yo acaba de empezar la programación multiproceso eran sólo el billete para la sustitución de un «sueño bucle while».

Dejar respuesta

Please enter your comment!
Please enter your name here