¿Cómo funciona el método scheduledExecutorService.scheduleAtFixedRate () asegura la ejecución en tiempo real?

StackOverflow https://stackoverflow.com/questions/1513518

Pregunta

Debido a que estoy ejecutando una tarea crítica vez cada segundo, he comparado varios métodos para encontrar la mejor manera de asegurar que mi tarea es realmente ejecutado en intervalos de tiempo fijos. Después de calcular la desviación típica del error para todos los métodos Parece que con el método scheduledExecutorService.scheduleAtFixedRate() conduce a los mejores resultados, pero no tengo idea de por qué esto es así.

¿Alguien sabe que el método funciona internamente? ¿Cómo lo hace por ejemplo en comparación con un simple sleep() asegurar que la tarea se hace referencia está realmente ejecutado en intervalos de tiempo fijos?

¿Fue útil?

Solución

A 'normal' Java VM no puede ofrecer ninguna garantía de tiempo real acerca de los tiempos de ejecución (y como consecuencia de que también sobre los tiempos de programación). Si realmente necesita de tiempo real garantiza que usted debe echar un vistazo a una máquina virtual en tiempo real como Java RTS . Por supuesto que necesita un sistema operativo de tiempo real, en ese caso también.

En cuanto a comparación con Thread.sleep (): la ventaja de scheduledExecutorService.scheduleAtFixedRate () en comparación con un uso (naive) de Thread.sleep () es que no se ve afectado por el tiempo de ejecución de la tarea programada. Ver ScheduledFutureTask.runPeriodic () sobre cómo se implementa esto.

Otros consejos

Puede tener un aspecto de la implementación de OpenJDK7 ScheduledThreadPoolExecutor.java que es la única clase que implementa la interfaz ScheduledExecutorService.

Sin embargo por lo que yo sé no hay garantía en el ScheduledExecutorService por la precisión. Así que incluso si sus measurments muestran que esto es bastante precisos que puede no ser el caso si se cambia a una plataforma diferente, vm o JDK.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top