Java JVM-Profilerstellung, Thread-Status - Was bedeutet "Monitor" -Status?

81

Geben Sie hier die Bildbeschreibung ein

Ich benutze VisualVM, um eine Java-Anwendung mit mehreren Threads zu verbinden. Der Thread hat den Status 4, nämlich Ausführen, Schlafen, Warten, Überwachen. Was bedeutet dieser Überwachungsstatus? Was ist der Unterschied zwischen Warten und Überwachen?

user84592
quelle

Antworten:

89

Diese Zustände sind die gleichen wie in der Thread.StateAufzählung erwähnt. "Warten" bedeutet, wie in der Dokumentation angegeben:

Ein Thread befindet sich im Wartezustand, da eine der folgenden Methoden aufgerufen wird:

  • Object.wait ohne Timeout
  • Thread.join ohne Zeitüberschreitung
  • LockSupport.park

"Monitor" ist der BLOCKEDZustand, in dem der Thread darauf wartet, eine Sperre für ein Objekt zu erhalten (weil er versucht, einen synchronizedBlock oder eine Methode einzugeben , während ein anderer Thread bereits die zugehörige Sperre besitzt).

Jesper
quelle
24
Es kann hilfreich sein, wenn jemand, der mit dem Thema noch nicht vertraut ist (wie das OP), weiß, dass "Monitor" hier und in der Dokumentation als Synonym für "Sperren" verwendet wird.
Matt B
6
Gibt es überhaupt eine Möglichkeit zu wissen, welches synchronisierte Objekt (oder welche Codezeile) den Thread BLOCKIERT / überwacht?
user123321
3
@ user123321 Sie können einen Thread-Dump erstellen. (Schaltfläche in der oberen rechten Ecke der Registerkarte "Threads".) Dort können Sie sehen, mit was der Thread zu synchronisieren versucht und welcher Thread die Sperre hält.
Fildor
Und was ist der Unterschied zwischen sleepingund waitingim Screenshot gezeigt ?!
Muhammad Gelbana
7

Dies ist kein "Überwachungsstatus". Dies zeigt an, dass sich der Thread im Thread.State.BLOCKEDStatus befindet. Ich sehe, dass es eine andere gute Antwort gibt. Ich werde Sie nur auf diesen Link verweisen, um eine tiefere Erklärung zu erhalten

Grooveek
quelle
5

Monitor bedeutet, dass der Thread darauf wartet, eine Sperre für ein Objekt zu erreichen. Wenn beispielsweise ein Thread eine synchronisierte Methode ausführt und ein anderer versucht, sie für dasselbe Objekt aufzurufen, kann dies erst nach Abschluss des ersten Aufrufs der Methode erfolgen. Dies liegt daran, dass der erste Thread einen Monitor oder eine Sperre für dieses Objekt hat, sodass der zweite warten muss, bis er freigegeben wird.

Aus Oracle Threading-Tutorials :

"Die Synchronisierung basiert auf einer internen Entität, die als intrinsische Sperre oder Monitorsperre bezeichnet wird. (In der API-Spezifikation wird diese Entität häufig einfach als" Monitor "bezeichnet.) Intrinsische Sperren spielen bei beiden Aspekten der Synchronisierung eine Rolle: Erzwingen des exklusiven Zugriffs auf eine Der Zustand des Objekts und das Herstellen von Beziehungen erfolgen vor Beziehungen, die für die Sichtbarkeit wesentlich sind. "

Mogronalol
quelle