2009-07-17 4 views
0

Nous devons garder un œil sur l'horloge du PC à partir d'un programme Java. Pour cela, nous programmons un Runnable en utilisant scheduleAtFixedRate() toutes les 500 ms. Nous appelons System.currentTimeMillis() à chaque fois. Si nous voyons qu'il y a une plus grande différence que 500 ms + - un certain delta permis, alors nous supposons que l'horloge a changé (alors nous devons faire autre chose).Quelle est la précision de scheduleAtFixedRate?

Serait-ce une façon correcte de faire les choses? Les tests sur Linux montrent qu'un delta de 50 ms est suffisant pendant le fonctionnement normal. Sur windows, il faut l'augmenter aussi de 100 ms, sinon, on se dit que le temps a changé à chaque vérification.

D'autres idées sur comment faire cela?

Répondre

2

si l'objectif est de détecter les changements d'horloge, vous pouvez tester l'horloge en cours contre un savoir timeserver référence

look pour plus d'informations ici Java NTP client http://support.ntp.org/bin/view/Support/JavaSntpClient en utilisant une source de temps absolu, vous serez en mesure de détecter l'horloge changements

+0

Merci pour le lien, mais le commentaire dans la question liée indique déjà qu'il est une implémentation naïve. –

0

Je suppose que vous utilisez les classes Timer et TimerTask.

Peut-être pourriez-vous utiliser la méthode schedule au lieu de scheduleAtFixedRate. La planification de la méthode transmettant une date, vous permet de définir la tâche pour une date d'exécution, vous pouvez simplement conserver le ré-ordonnancement à la fin de votre dernière exécution. Vous pouvez également utiliser la planification passant le délai, qui n'effectue pas de rattrapage comme le fait scheduleAtFixedRate.

javadoc Timer

+1

Timer et TimerTask sont maintenant obsolètes. ScheduledExecutorService fait tout cela et plus encore. – skaffman

+0

oui, ScheduledExecutorService est ce que nous utilisons. –