2011-12-24 19 views
5

Utilizo java.util.Timer para desencadenar trabajos en mi aplicación, pero descubrí que depende del tiempo del sistema: si se ajusta la hora del sistema, el disparador del temporizador se verá afectado.Temporizador estable independiente de la hora del sistema

Por ejemplo, si el tiempo del sistema retrocede 80 segundos, el temporizador dejará de funcionar durante 80 segundos.

Java tiene un método System.nanoTime que es independiente del tiempo del sistema, pero parece que no se puede utilizar en .

¿Hay una biblioteca de temporizador que admita lo que necesito? O tengo que implementarlo yo mismo?

en cuenta que no necesito una hora precisa (fecha), necesito un intervalo de tiempo precisa

+0

Desde Java 5.0 (2004) puede usar ScheduledExecutorService. –

+1

@PeterLawrey, nanoTime existe desde la misma versión, por lo que el OP debe saber acerca de ScheduledExecutor. – bestsss

+0

Utilicé ScheduledExecutoeService, pero tengo problemas con la JVM de 64 bits. Por favor, ayuda http://stackoverflow.com/questions/9044423/java-scheduler-which-is-completely-independent-of-system-time-changes – YoK

Respuesta

6

tiene 2 opciones:

  • ESCRIBE un temporizador, relativamente trivial. Antes de que alguien diga reinvent the wheel, ser capaz de llevar a cabo la tarea usted mismo siempre es importante. Especialmente cuando se trata de alrededor de 20 líneas de código.
  • Use java.util.concurrent.ScheduledThreadPoolExecturor y use scheduleAtFixedRate, la cola impl. se basa en System.nanoTime.
  • Instalar ntp daemon que ajusta el tiempo mediante la afinación (ralentización, aceleración) del reloj del sistema de forma muy leve durante un largo período de tiempo.

Pocas cosas, 100ms perfectos es una tarea difícil en un entorno de GC no real ya que el GC puede STW (detener el mundo) por unos segundos a veces. Los GC de Sun no pueden hacer eso súper confiablemente. Se supone que el Metronome de IBM que se ejecuta en kernel de Linux modificado puede. Es posible que desee prestar atención a si su aplicación es realmente exigente en tiempo real.

0

Si se aísla el ordenador y fuera de Internet creo que no hay mucho que puede hacer si el usuario altera el reloj

Por otro lado, si este no es el caso, encontrará muchas API y mashups que le permitirán leer la hora correcta. Podrías leer el tiempo desde allí. Puede leer la hora desde time.gov. También twinsun.com le ofrece muchas opciones adicionales.

Parece que 100 ms es demasiado bajo para el acceso a Internet.

+0

Sí, otra solución es permitir que el sistema ajuste automáticamente el tiempo del sistema en una frecuencia adecuada. Si el rango de cambio en 1 o 2 segundos, puede ser aceptado. Pero eso no es perfecto. – jean

Cuestiones relacionadas