Java – alternativa a thread.sleep

Tengo un requerimiento para pausar un ciclo while por 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 progtwig.

Aquí está el algoritmo en el que no quiero volver para comprobar la condición hasta expectedElapsedTime haya producido el 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; } 

    Pruebe un ScheduledThreadPoolExecutor . Se supone que brinda resultados de tiempo más confiables.

    ¿Qué esperas?

    Si te vas a dormir, una vez que tu proceso vuelva a ser ejecutable, tendrá que esperar a que el progtwigdor de hilos lo programe nuevamente.

    Es decir, si te duermes durante 50 segundos, eso no significa que tu proceso se ejecutará en exactamente 50 segundos. Debido a que se despierta y se puede ejecutar, tendrá que esperar para progtwigrse en la CPU, lo que requiere tiempo extra más el tiempo que 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, sugeriría un bucle giratorio en su lugar.

     long now = System.currentTimeMillis(); while(now < expectedElapsedTime){ now = System.currentTimeMillis(); } 

    Java no es un sistema en tiempo real, no puede hacer desaparecer un hilo y volver a un horario tan apretado. Para progtwigr la ejecución de su progtwig en milisegundos, debe usar una plataforma diferente, como la extensión simpleRTJ o Java Real-Time .

    Es probable que la demora sea elegida arbitrariamente, por lo que cuestionaría su necesidad de tiempo de intervalo en tiempo real.

    Si necesita tiempo de lectura, debe esperar para alcanzar el tiempo. Renunciar a la CPU significa que no puede garantizar que la recuperará exactamente cuando lo desee.

    Podría implementar el mecanismo de esperar / notificar y delegar a otro hilo la responsabilidad de notificar al otro hilo en estado de espera que se ha pasado el tiempo y que puede continuar …

    Por ejemplo, cuando el threadA necesita esperar cierto tiempo, puede poner el hilo en estado de espera e iniciar una tarea de temporizador que después de una cierta cantidad de tiempo (intervalo) de llamada notificar y despertar el ThreadA que sigue adelante, esto podría ser una alternativa

    Si quiere ser preciso con los sonidos, usa un secuenciador y ajuste el tempo en BPM: sequencer.setTempoInBPM (120);

    No te olvides de las pausas del recolector de basura. Puede vencer todos tus planes

    La solución es usar un manejador 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://stackoverflow.com/a/21680858