Comment la classe Timer en Java est-elle sensible à l'horloge système? [dupliquer]


Cette question a déjà une réponse ici:

Cette réponse hautement votée sur SO concernant les différences entre a Timer et a ScheduledThreadPoolExecutor mentionne ce qui suit tout en énumérant les différences:

La minuterie peut être sensible aux changements de l'horloge système, ScheduledThreadPoolExecutor n'est pas.

Ce qui précède est mentionné mot pour mot dans le grand livre Java Concurrency in Practice.

Je comprends les points mentionnés dans cette réponse, sauf celui mentionné ci-dessus. Que signifie dire que Timers peut être sensible à l'horloge système alors que ScheduledThreadPoolExecutors ne le sont pas?

Author: Community, 2013-09-14

3 answers

Timer utilise System.currentTimeMillis(), qui représente heure de l'horloge murale et ne doit jamais être utilisé pour vérifier les temps relatifs tels que déterminer combien de temps quelque chose a pris pour s'exécuter ou, dans ce cas, combien de temps pour retarder avant d'exécuter une tâche. System.currentTimeMillis() est affecté par des choses comme les ajustements automatiques de l'horloge système ou même la modification manuelle de l'horloge système. En tant que tel, si vous l'appelez deux fois et vérifiez la différence entre les temps que vous obtenez, vous pouvez même obtenir un nombre négatif.

System.nanoTime(), sur le d'autre part, est spécifiquement destiné à mesurer le temps écoulé et est ce qui devrait être utilisé pour ce genre de chose.

 9
Author: ColinD, 2013-09-14 16:25:18

Timer utilise System.currentTimeMillis() pour déterminer la prochaine exécution d'une tâche.

Cependant ScheduledThreadPoolExecutor utilise System.nanoTime().

De même, la méthode nanoTime()ne peut être utilisée que pour mesurer le temps écoulé et n'est liée à aucune autre notion de temps système ou d'horloge murale.

System.currentTimeMillis() est sensibles pour de l'horloge du système

System.nanoTime() est pas sensible pour de l'horloge système, car il mesure le temps écoulé.

Documentation De Java: System.nanoTime()

Cette méthode ne peut être utilisée pour mesure du temps écoulé et n'est pas lié à toute autre notion de système ou de temps d'horloge murale. Valeur retourné représente des nanosecondes depuis un certain temps fixe mais arbitraire (peut-être à l'avenir, donc les valeurs peuvent être négatives).

 5
Author: Narendra Pathai, 2013-09-14 16:38:02

En regardant la source, La classe Timer planifie les tâches en utilisant System.currentTimeMillis(). Le ScheduledThreadPoolExecutor utilise System.nanoTime().

currentTimeMillis() aura tendance à utiliser l'horloge du système d'exploitation, celle qui suit la date/heure actuelle. nanoTime() aura tendance à utiliser une horloge matérielle de plus haute résolution.

Si vous déplacez l'horloge de votre système d'exploitation en arrière d'une heure, alors currentTimeMillis() pourrait devrait refléter cela tandis que nanoTime() ne devrait pas.

 1
Author: Kemick, 2013-09-14 16:33:56