2011-07-01 10 views
22

En el JDK, se implementa como:¿Cuál es el propósito de dormir (long millis, int nanos)?

public static void sleep(long millis, int nanos) 
throws InterruptedException { 
if (millis < 0) { 
     throw new IllegalArgumentException("timeout value is negative"); 
} 

if (nanos < 0 || nanos > 999999) { 
     throw new IllegalArgumentException(
      "nanosecond timeout value out of range"); 
} 

if (nanos >= 500000 || (nanos != 0 && millis == 0)) { 
    millis++; 
} 

sleep(millis); 
} 

lo que significa que el argumento nanos no hacer nada en absoluto.

¿Está la idea detrás de esto de que en el hardware con tiempos más precisos, la JVM puede proporcionar una mejor implementación para ello?

+3

bueno, hace * algo *, choca millis si es más de medio ms o si ms es cero. –

+1

bueno, sí, no * nada * ... pero es prácticamente inútil. –

+0

¿El código fuente es de Open JDK? – Marcelo

Respuesta

11

Un sistema operativo regular no tienen una resolución suficiente de grano fino a dormir durante nanosegundos a la vez. Sin embargo, existe real time operating systems, donde la programación de un evento que tendrá lugar en un momento exacto en el tiempo es crítica y las latencias para muchas operaciones son MUY bajas. Un sistema ABS es un ejemplo de RTOS. Dormir durante nanosegundos es mucho más útil en tales sistemas que en sistemas operativos normales donde el sistema operativo no puede dormir confiablemente por un período inferior a 15 ms.

Sin embargo, tener dos JDK separados no es una solución. Por lo tanto, en Windows y Linux, la JVM hará un mejor intento de dormir durante x nanosegundos.

+0

El mínimo de 15ms al que se refiere solo es verdadero para Windows. En Linux puedes hacer 1ms duerme. Pero incluso en Windows, puede usar ['timeBeginPeriod()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd757624.aspx) para aumentar la resolución del temporizador, lo que le permitirá dormir por intervalos más pequeños, también. Sin embargo, esto es una configuración global (que afecta a todos los programas en ejecución) y aumentará el uso de la CPU, el consumo de energía y 'también puede reducir el rendimiento general del sistema '. De hecho, podría tener efectos significativos en los programas que hacen 'sleep (1)', dependiendo del intervalo predeterminado de 15 ms. –

7

Parece una adición a prueba de futuro, para cuando todos tengamos laptops petaflop y rutinariamente especificamos demoras en nanosegundos. Mientras tanto, si especifica un retraso de un nanosegundo, obtendrá un retraso de milisegundos.

Cuando el hardware mejora y la JVM lo sigue, no será necesario volver a escribir la aplicación.

0

El problema con futuras pruebas es la compatibilidad con versiones anteriores. Este método ha funcionado de esta manera durante tanto tiempo que, si desea demoras de submicro-segundo, debe usar diferentes métodos.

Para la comparación,

Object.wait(millis, nano); 
+3

Eso se implementa exactamente como 'sleep (...)'. simplemente llama a 'wait (millis)', a menos que 'millis == 0 || nanos> = 500000', en cuyo caso llama a 'wait (millis + 1)' –

Cuestiones relacionadas