2016-10-05 3 views
6

Ich habe einen Thread, der Daten in eine Warteschlange schiebt und einen anderen Thread, der Daten aus der Warteschlange liest und verarbeitet. Ich möchte überprüfen, wie lange die Daten in der Warteschlange sitzen, bevor sie verarbeitet werden.Kann NanoTime über Threads hinweg arbeiten

Ich fügte einen Zeitparameter (berechnet mit System.nanoTime()) in die Daten ein, bevor sie vom ersten Thread übertragen wurden. Sobald der zweite Thread es verarbeitet, berechnet es System.nanoTime() und findet den Unterschied zu der vorherigen Zeit, die in den Daten festgelegt ist.

Würde das richtig funktionieren? Ich frage das, weil ich einen negativen Unterschied in den Protokollen sehe.

UPDATE

ich, dass klären möchte, wird die Startzeit durch einen Prozess in einer anderen Maschine setzen und die Differenz wird in einer anderen Maschine berechnet.

+0

ist die auf einer einzigen Maschine befindet Warteschlange? Können Sie nicht stattdessen die Zeit in der Warteschlange messen? – nandsito

+0

Die Warteschlange befindet sich in Redis. Wie können wir die Zeit in der Warteschlange messen? – cppcoder

Antwort

3

Ich habe System.nanoTime() zwischen Threads und Prozessen verwendet. Auf einem einzelnen Computer ist es sowohl global als auch monoton steigend (mit Ausnahme von Windows XP mit mehreren Sockets)

Wenn Sie einen negativen Unterschied sehen, ist es höchstwahrscheinlich ein Fehler in Ihrem Code.

Sie können nanoTime() zwischen den Maschinen sehen, aber Sie müssen für die Differenz und Drift zwischen den Uhren anpassen. (Und Sie können große, sehr negative Ergebnisse erhalten, wenn Sie diese Korrektur nicht vornehmen)

Die Startzeit wird von einem Prozess in einer anderen Maschine eingegeben und die Differenz wird in einer anderen Maschine berechnet.

Zwischen Maschinen müssen Sie entweder

  • Verwendung System.currentTimjeMillis(), die zu einer Millisekunde mit NTP in der Regel genau ist.
  • Verwenden Sie System.nanoTime() für eine Hin- und Rückfahrt, d. H. Senden Sie eine Nachricht von A ro B und eine andere zurück an A. Die Halbrundreisezeit kann davon geschätzt werden.
  • Verwenden Sie System.nanoTime() nicht für die verstrichene Zeit, sondern um Jitter zu erkennen. Dies setzt voraus, dass die Verzögerung meistens akzeptabel ist (etwa 10 bis 100 Mikrosekunden), aber manchmal ist sie viel höher als normal. Ich verwende diese Klasse, um Jitter zu erkennen. RunningMinimum

Wenn Sie daran interessiert sind nur in Multi-Millisekunde Verzögerungen würde ich currentTimeMillis() verwenden

+0

Ich denke, das ist genau das, was ich vor mir habe. Könnten Sie bitte erklären, wie Sie den Unterschied zwischen den Maschinen einstellen können? – cppcoder

+0

Ich glaube nicht, dass es einen Sinn hat, 'nanoTime' auf mehreren Rechnern arbeiten zu lassen, und sogar zwischen Prozessen funktioniert es nur zufällig (es muss nicht funktionieren). –

+0

Gibt es einen anderen Mechanismus, um die verstrichene Zeit zwischen den Maschinen zu finden? – cppcoder

Verwandte Themen