webentwicklung-frage-antwort-db.com.de

VisualVM - Thread-Zustände

Kann mir bitte jemand den Unterschied zwischen den Thread-Zuständen Sleeping, Wait, Park und Monitor in VisualVM erklären.

enter image description here

Folgendes habe ich gefunden:

Running: Thread läuft noch.
Sleeping: Thread schläft (Methode yield () wurde für das Thread-Objekt aufgerufen)
Wait: Thread wurde von einem Mutex oder einer Barriere blockiert und wartet darauf, dass ein anderer Thread die Sperre aufhebt
Park: Geparkte Threads werden ausgesetzt, bis sie eine Genehmigung erhalten. Das Entparken eines Threads erfolgt normalerweise durch Aufrufen der Methode unpark () für das Thread-Objekt
Monitor: Threads warten auf die Erfüllung einer Bedingung, um die Ausführung fortzusetzen

Was ich nicht verstehen kann ist der State Park, was hängt eigentlich am Thread? Wie erkenne ich im Code, warum der Thread die Ausführung angehalten hat?

Kann mich diesbezüglich bitte jemand anleiten.

Vielen Dank.

67
Ali Shah Ahmed

Ich habe Google verwendet und die allererste Seite, die auftauchte, hatte ein sehr nettes Diagramm, das so ziemlich alles beschreibt, was Sie wissen müssen/wollen. Das nächste Mal lohnt es sich, Google für diese Art von Fragen auszuprobieren.

enter image description here

1) Neu

Der Thread hat einen neuen Status, wenn Sie eine Instanz der Thread-Klasse erstellen, jedoch vor dem Aufruf der start () -Methode.

2) lauffähig

Der Thread ist nach dem Aufrufen der start () -Methode im ausführbaren Zustand, aber der Thread-Scheduler hat ihn nicht als ausgeführten Thread ausgewählt.

3) Laufen

Der Thread befindet sich im aktiven Zustand, wenn der Thread-Scheduler ihn ausgewählt hat.

4) Zeitgesteuertes Warten

Zeitgesteuertes Warten ist ein Thread-Status für einen Thread, der mit einer angegebenen Wartezeit wartet. Ein Thread befindet sich aufgrund des Aufrufs einer der folgenden Methoden mit einer angegebenen positiven Wartezeit im Status "Zeitgesteuertes Warten":

  • Thread.sleep (Schlafenszeit)
  • Object.wait (Zeitüberschreitung)
  • Thread.join (Zeitüberschreitung)
  • LockSupport.parkNanos (Zeitüberschreitung)
  • LockSupport.parkUntil (Zeitüberschreitung)

5) Nicht lauffähig (gesperrt)

Dies ist der Status, in dem der Thread noch aktiv ist, derzeit jedoch nicht ausgeführt werden kann.

6) Abgebrochen

Ein Thread ist beendet oder inaktiv, wenn die run () -Methode beendet wird.

Hoffentlich beantwortet dies Ihre Frage :).

Parken:

Deaktiviert den aktuellen Thread zu Zwecken der Thread-Planung, sofern keine Erlaubnis vorliegt.

Threads werden geparkt oder angehalten, wenn Sie dies so aufrufen möchten, da sie keine Ausführungsberechtigung haben. Sobald die Erlaubnis erteilt wurde, wird der Thread entparkt und ausgeführt.

Berechtigungen von LockSupport sind mit Threads verknüpft (d. H., Die Berechtigung wird einem bestimmten Thread erteilt) und sammeln sich nicht an (d. H. Es kann nur eine Berechtigung pro Thread geben, wenn der Thread die Berechtigung verbraucht, verschwindet sie).

45
Maciej Cygan

VisualVM ordnet den Thread-Status Java wie in der Antwort von @ Maciej beschrieben) dem Status zu, der in der Benutzeroberfläche angezeigt wird:

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

Sleeping und Park sind spezielle Fälle von (zeitgesteuertem) Warten:

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in Sun.misc.Unsafe.park() (presumably via LockSupport).

(Das Mapping erfolgt in ThreadMXBeanDataManager.Java.)

Eine kurze (und nicht maßgebliche) Diskussion über den Thread-Status Java) findet sich hier .

BEARBEITET ZUM HINZUFÜGEN:

Es ist auch erwähnenswert, dass Threads, die in Aufrufen nativer Methoden blockieren, in der JVM als RUNNABLE angezeigt werden und daher von VisualVM als Running gemeldet werden (und 100% der CPU verbrauchen).

31
Jeremy