esperas - Java-alternativa a thread.sleep
wait milliseconds java (8)
Tengo el requisito de pausar un bucle while durante un número específico de milisegundos. He intentado usar Thread.sleep (duración) pero no es preciso, especialmente en un escenario de bucle. La precisión de milisegundos es importante en mi programa.
Aquí está el algoritmo donde no quiero volver para verificar la condición hasta expectedElapsedTime
haya pasado el tiempo expectedElapsedTime
.
while (condition) {
time = System.currentTimeMillis();
//do something
if (elapsedTime(time) < expectedElapsedTime) ) {
pause the loop // NEED SUBSTITUTE FOR Thread.sleep()
}
// Alternative that I have tried but not giving good results is
while ((elapsedTime(time) < expectedElapsedTime)) {
//do nothing
}
}
long elapsedTime(long time) {
long diff = System.currentTimeMillis() - time;
return diff;
}
¿Qué esperas?
Si va a dormir, una vez que su proceso sea ejecutable nuevamente, tendrá que esperar a que el programador de hilos lo programe nuevamente.
Quiero decir que si se duerme durante 50 segundos, eso no significa que su proceso se ejecutará en exactamente 50 segundos. Como se reactiva y se puede ejecutar, tendrá que esperar para ser programado en la CPU, lo que lleva más tiempo más el tiempo tener para el cambio de contexto.
No hay nada que pueda hacer para controlarlo, por lo que no puede tener la precisión que está diciendo.
Para su caso yo sugeriría un bucle giratorio en su lugar.
long now = System.currentTimeMillis();
while(now < expectedElapsedTime){
now = System.currentTimeMillis();
}
Es probable que la demora sea elegida arbitrariamente, por lo que cuestionaría su necesidad de un intervalo de tiempo real.
Si necesita tiempo para leer, debe estar ocupado, esperar el tiempo para llegar. Renunciar a la CPU significa que no puede garantizar que la recuperará exactamente cuando lo desee.
Java no es un sistema en tiempo real, no puede hacer que un hilo desaparezca y vuelva en un horario tan apretado. Para programar la ejecución de su programa en milisegundos, necesita usar una plataforma diferente, como simpleRTJ o la extensión Java Real-Time .
La solución es usar un controlador con un ejecutable y el uso del método ''PostDelayed''. Ejemplo:
new Handler().postDelayed(new Runnable() {
public void run () {
// Do delayed stuff!
}
}, 5000L); //5 seconds delay
https://.com/a/21680858
No te olvides de las pausas del recolector de basura. Puede vencer a todos tus planes.
Podría implementar el mecanismo de esperar / notificar y delegar en otro subproceso la responsabilidad de notificar al otro subproceso en estado de espera que se ha pasado la cantidad de tiempo y que puede seguir adelante ...
Por ejemplo, cuando el subproceso debe esperar un cierto tiempo, puede poner el subproceso en estado de espera y comenzar una tarea de temporizador que, después de un cierto tiempo (intervalo), notifica y activa el subproceso que sigue adelante, esto podría ser una alternativa
Pruebe un ScheduledThreadPoolExecutor . Se supone que debe dar resultados de tiempo más confiables.
Si quieres ser preciso con los sonidos, utiliza un secuenciador y configura el tempo en BPM: sequencer.setTempoInBPM (120);