VisualVM - Thread-Zustände

85

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

Geben Sie hier die Bildbeschreibung ein

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 durch einen Mutex oder eine Barriere blockiert und wartet darauf, dass ein anderer Thread die Sperre
Parkaufhebt: 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 eine Bedingung, um wahr zu werden und die Ausführung fortzusetzen

Was ich nicht verstehen kann, ist der State Park, was setzt den Thread tatsächlich aus? Wie erkenne ich im Code, warum der Thread seine Ausführung ausgesetzt hat?

Kann mich bitte jemand in dieser Hinsicht führen.

Vielen Dank.

Ali Shah Ahmed
quelle

Antworten:

53

Ich habe ein sehr schönes Diagramm gefunden, das so ziemlich alles beschreibt, was Sie brauchen / wollen.

Geben Sie hier die Bildbeschreibung ein

  1. Neu

Der Thread befindet sich in einem neuen Status, wenn Sie eine Instanz der Thread-Klasse erstellen, jedoch vor dem Aufruf der start () -Methode.

  1. Runnable

Der Thread befindet sich nach dem Aufruf der start () -Methode im ausführbaren Zustand, der Thread-Scheduler hat ihn jedoch nicht als laufenden Thread ausgewählt.

  1. Laufen

Der Thread wird ausgeführt, wenn der Thread-Scheduler ihn ausgewählt hat.

  1. Zeitgesteuertes Warten

Das zeitgesteuerte Warten ist ein Thread-Status für einen Thread, der mit einer bestimmten Wartezeit wartet. Ein Thread befindet sich im zeitgesteuerten Wartezustand, da eine der folgenden Methoden mit einer angegebenen positiven Wartezeit aufgerufen wird:

  • Thread.sleep (Schlafenszeit)
  • Object.wait (Zeitüberschreitung)
  • Thread.join (Zeitüberschreitung)
  • LockSupport.parkNanos (Zeitüberschreitung)
  • LockSupport.parkUntil (Zeitüberschreitung)
  1. Nicht lauffähig (blockiert)

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

  1. Beendet

Ein Thread befindet sich beim Beenden seiner run () -Methode im terminierten oder toten Zustand.

Hoffentlich beantwortet dies Ihre Frage :).

Parken:

Deaktiviert den aktuellen Thread für Thread-Planungszwecke, sofern die Genehmigung nicht verfügbar ist.

Threads werden geparkt oder angehalten, wenn Sie es so nennen möchten, da es keine Berechtigung zum Ausführen hat. Sobald die Berechtigung erteilt wurde, wird der Thread entparkt und ausgeführt.

Berechtigungen von LockSupport sind Threads zugeordnet (dh die Genehmigung wird einem bestimmten Thread erteilt) und werden nicht akkumuliert (dh es kann nur eine Genehmigung pro Thread geben, wenn der Thread die Genehmigung verbraucht, verschwindet sie).

Maciej Cygan
quelle
Vielen Dank für Ihre Antwort. Ich habe das auch durchgemacht, aber irgendwie blieb meine Frage immer noch unbeantwortet. Könnten Sie bitte meine Frage noch einmal durchgehen? Ich habe es aktualisiert. Bin besonders auf der Suche nach einer Antwort für den Parkstaat.
Ali Shah Ahmed
Nochmals vielen Dank für das Update. Wartet der Thread im Bundesstaat Park darauf, dass er geplant wird, oder wartet er unter bestimmten Bedingungen?
Ali Shah Ahmed
@AliShahAhmed Thread wartet auf die Ausführung der Berechtigung (Bedingung) - wenn diese Bedingung für einen bestimmten Zeitraum nicht erfüllt ist, wird das Timeout erreicht und der Thread beendet - PS. Entschuldigung für die verspätete Beantwortung haha
Maciej Cygan
39

VisualVM ordnet den Java-Thread-Status (wie in der Antwort von @ Maciej beschrieben) dem Status in seiner Benutzeroberfläche wie folgt zu:

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

Sleepingund Parksind 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 wird in durchgeführt ThreadMXBeanDataManager.java.)

Eine kurze (und nicht autorisierende) Diskussion des Java-Thread-Status finden Sie hier .

BEARBEITET ZUM HINZUFÜGEN:

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

Jeremy
quelle
2
Dies sollte die richtige Antwort sein. Die Frage betraf die JVisualVM-Thread-Zustände, nicht die JVM-Thread-Zustände.
digital_infinity