2016-10-05 3 views
6

J'ai un thread qui pousse les données dans une file d'attente et un autre thread qui lit les données de la file d'attente et les traite. Je voudrais vérifier combien de temps les données se trouvent dans la file d'attente avant d'être traitées.Est-ce que nanoTime peut fonctionner sur les threads

J'ai ajouté un paramètre de temps (calculé en utilisant System.nanoTime()) dans les données avant d'être poussé par le premier thread. Une fois que le deuxième thread le traite, il calcule System.nanoTime() et trouve la différence par rapport à l'heure précédente définie dans les données.

Est-ce que cela fonctionnerait correctement? Je pose cette question parce que je vois une différence négative dans les journaux.

MISE À JOUR

Je voudrais préciser que, le temps de démarrage est mis par un processus dans une autre machine et la différence est calculée dans une autre machine.

+0

est la file d'attente située sur une seule machine? ne pouvez-vous pas mesurer le temps dans la file d'attente à la place? – nandsito

+0

La file d'attente est en redis. Comment pouvons-nous mesurer le temps dans la file d'attente? – cppcoder

Répondre

3

J'ai utilisé System.nanoTime() entre les threads et les processus. Sur une seule machine, elle est à la fois globale et monotone (à l'exception du multi-socket Windows XP)

Si vous voyez une différence négative, il s'agit probablement d'un bug dans votre code.

Vous pouvez voir nanoTime() entre les machines, mais vous devez ajuster la différence et la dérive entre les horloges. (Et vous pouvez obtenir de grands résultats très négatifs si vous ne faites pas cette correction)

L'heure de début est mise par un processus dans une machine différente et la différence est calculée dans une machine différente.

Entre machines vous devez soit

  • System.currentTimjeMillis d'utilisation() qui est généralement précise à une milliseconde avec NTP.
  • utilisez System.nanoTime() pour un aller-retour, c'est-à-dire envoyer un message de A ro B et un autre retour à A. Le temps de parcours demi-tour peut être estimé à partir de ceci.
  • utilisez System.nanoTime() pas pour le temps écoulé, mais pour détecter l'instabilité. Cela suppose que la plupart du temps, le retard est acceptable (disons 10 à 100 micro-secondes) mais parfois il est beaucoup plus élevé que la normale. J'utilise cette classe pour aider à détecter la gigue. RunningMinimum

Si vous ne souhaitez que des retards de plusieurs milli secondes j'utiliser currentTimeMillis()

+0

Je pense que c'est exactement ce à quoi je suis confronté. Pourriez-vous s'il vous plaît expliquer comment ajuster la différence entre les machines? – cppcoder

+0

Je ne pense pas qu'il soit utile d'essayer de faire fonctionner nanoTime sur les machines et même entre les processus, cela ne fonctionne que par accident (n'est pas nécessaire de travailler). –

+0

Existe-t-il un autre mécanisme pour trouver le temps écoulé entre les machines? – cppcoder