¿Cuán exacto es Thread.sleep?

Estoy estudiando hardware de computadora donde descubrimos que el uso de un temporizador de hardware obtiene resultados más precisos que un retraso de software. He escrito un retraso de software en el ensamblaje de 1 milisegundo y puedo comenzar un proceso que se repite cada milisecado usando este retraso y con un contador hacer otra cosa cada centésimo milisegundo, y esta técnica sería menos precisa que usar un temporizador de hardware que tengo incorporado mi hardware que voy a usar ahora.

Entonces me pregunto qué tan preciso es el tiempo que está incorporado con Java. Tenemos System.currentTimeMillis y Thread.sleep y es posible que estos no usen temporizadores de hardware, entonces, ¿qué tan precisos son estos métodos integrados de Java en comparación con un temporizador de hardware?

Thread.sleep() es inexacto. Qué tan impreciso depende del sistema operativo subyacente y sus temporizadores y progtwigdores. He experimentado que la recolección de basura que se desarrolla en paralelo puede provocar un sueño excesivo.

Al realizar simulaciones en “tiempo real”, debe corregir el ciclo principal para conocer las imprecisiones del sleep . Esto se puede hacer calculando el tiempo esperado de activación y comparándolo con el tiempo real de activación y corrigiendo la diferencia en el siguiente ciclo.

Si necesita un mejor rendimiento, eche un vistazo a la especificación de Java Real-Time System . No lo he usado yo mismo, así que no puedo proporcionar más detalles.

De la especificación del lenguaje Java.

Thread.sleep hace que el subproceso que se está ejecutando se ponga en espera (suspenda temporalmente la ejecución) durante el tiempo especificado, sujeto a la precisión y precisión de los temporizadores y planificadores del sistema. El hilo no pierde la propiedad de ningún monitor, y la reanudación de la ejecución dependerá de la progtwigción y la disponibilidad de los procesadores para ejecutar el hilo.

No encontré Thread.sleep para ser exacto. De hecho, descubrí que parece dormir menos de lo que promete.

Resultados cuando está configurado para dormir 1 milisegundo:

 ********* Average elapsed time = 957 micro seconds 

A continuación está mi prueba:

 public static void main(String[] args) throws InterruptedException { List list = new ArrayList(); int i= 0; while(i < =100){ long authStartTime = System.nanoTime(); Thread.sleep(1); long elapsedTime = System.nanoTime() - authStartTime; System.out.println("*****"+elapsedTime/1000+ " mics"); list.add(elapsedTime); i++; } long sum=0; for(long l : list){ sum = sum + l; } System.out.println("********* Average elapsed time = "+sum/list.size()/1000+" micro seconds"); System.exit(0); }