Thread-Lebenszyklus und Thread-Zustände – 1

„Hallo, Amigo!“

„Wir starten ein neues Thema: Threads.“

„Lassen Sie uns beginnen. Heute werden wir die Zustände untersuchen, die ein Thread-Objekt durchläuft (oder durchlaufen könnte), wenn ein Thread ausgeführt wird.“

„Wie viele Staaten kannst du jetzt nennen, Amigo?“

„Zweitens. Der erste ist ein Thread, bevor die start()-Methode aufgerufen wird: Das Objekt existiert, aber der Thread ist noch nicht aktiv. Und der zweite ist, nachdem die start()-Methode aufgerufen wurde: wenn der Thread etwas tut wichtig."

„Sie haben Recht – es gibt einen solchen Unterschied. Diese Zustände heißen „ new “ und „running “, aber das ist erst der Anfang.“

„Erstens wird der Thread irgendwann seine Ausführung beenden, was bedeutet, dass es eine Situation geben kann, in der das Thread-Objekt vorhanden ist, sich der Thread jedoch nicht im neuen oder laufenden Zustand befindet.“ Dieser Zustand, in dem die Ausführung des Threads beendet ist, wird aufgerufen beendet .“

„Aber es gibt noch mehr. Vergessen Sie nicht, dass zu jedem Zeitpunkt tatsächlich nur ein Thread ausgeführt wird. Was wie simultane Arbeit aussieht, ist in Wirklichkeit, dass der Prozessor ständig von Thread zu Thread springt. Es gibt einen separaten Status dafür, wann der Thread zu sein scheint läuft, wartet aber tatsächlich darauf, dass er an die Reihe kommt: Er heißt „ ready-to-run “. Während ein Thread arbeitet, wechselt er ständig von „ running“ zu „ ready “ und dann wieder zurück zu „ running “, wenn er wieder aktiv wird.

„Unmittelbar nach dem Aufruf der start ()-Methode wird dem Thread der Status „Bereit zur Ausführung“ zugewiesen und in eine gemeinsame Liste von Threads eingefügt, zwischen denen die JVM wechselt.“

„Das ist nicht allzu schwierig. Bevor es zu laufen beginnt, hat es den neuen Zustand. Nachdem es fertig ist, wird es beendet . Wenn es läuft , befindet sich der Thread im laufenden Zustand; wenn er wartet, ist er im Bereitschaftszustand ."

„Ihre Kürze ist erstaunlich, aber Sie haben Recht.“

„Aber es gibt noch mehr. Der Thread kann blockiert werden. Zum Beispiel, wenn Sie einen synchronisierten Block betreten . Wenn ein Thread zu einem als synchronisiert markierten Codeblock gelangt und ein anderer Thread ihn verwendet, wechselt unser Thread in den blockierten Zustand und wartet.“ damit der Mutex (Sperre) des Objekts freigegeben wird.

„So sieht diese Situation mit Staaten aus:“

Thread-Lebenszyklus und Thread-Zustände – 2

„Aber es gibt noch mehr. Es gibt auch einen separaten Zustand namens „ Warten “. Dies ist der Fall, wenn ein Thread nicht blockiert , aber auch nicht bereit ist . Zum Beispiel, wenn Sie die Methode „ join ()“ in einem anderen Thread aufrufen.“

Wenn wir join() für ein anderes Thread-Objekt aufrufen, ist es so, als würde unser Thread diesem „beitreten“, aber in Wirklichkeit wartet er nur darauf, dass der andere Thread fertig wird.

„Zusätzlich gibt es noch die Methode wait () (aus dem Methodentrio wait/notify/notifyAll), die einen Thread beim Aufruf in den Wartezustand versetzt.“

„Wow.“

„Moment mal! Es gibt noch mehr. Ein Thread kann zum Beispiel durch den Aufruf der Sleep-Methode in den Ruhezustand versetzt werden. Auch hierfür gibt es einen eigenen Zustand. Er heißt „zeitgesteuertes Warten“. „zeitgesteuertes Warten“ bedeutet, dass der Thread auf etwas wartet eine begrenzte Zeit. Wenn Sie eine Wartemethode mit einem Parameter wie wait(timeout) oder join(timeout) aufrufen, wechselt der Thread in den zeitgesteuerten Wartezustand.“

„Hier ist das vollständige Diagramm:“

Thread-Lebenszyklus und Thread-Zustände – 3

„Hmm. Ist das alles? Oder gibt es noch 10 weitere interessante Staaten?“

„Im Moment ist es das.“

„In der Praxis kann man sich einfach das erste Diagramm merken. Es ist einfacher. Aber das zweite ist genauer.“

„Seltsamerweise gibt es im Internet viele Thread-Zustandsdiagramme und sie sind alle unterschiedlich.“

„Deshalb habe ich Ihnen dieses Diagramm gegeben – es ist das vollständigste und korrekteste.“

„In diesem Diagramm sind die Zustände „Bereit“ und „Ausgeführt“ in einem einzigen Block namens „ausführbar“ zusammengefasst. Wissen Sie, warum?

„Nein. Es ist das erste Mal, dass ich so etwas sehe.“

„Die Thread- Klasse verfügt über eine innere Klasse namens State sowie eine öffentliche State-getState()- Methode.“

Beispiel
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

„Sie können jederzeit die Methode getState () für ein Thread- Objekt aufrufen und seinen aktuellen Status herausfinden. Und natürlich wird es einer der State-Enumerationswerte sein.“

„Ich verstehe. Die tatsächlichen Zustände befinden sich also innerhalb der JVM, aber es gibt auch Zustände, auf die Sie über Java-Code mit der Methode State getState() zugreifen können.“

„Und unter welchen Umständen würde ich das nutzen?“

„Höchstwahrscheinlich nie.“

„Aber man muss wissen, was in den Threads vor sich geht. Sonst gibt es viele Fehler, und man kann nicht einmal erraten, was sie verursacht.“

„Außerdem fragen Arbeitgeber bei Vorstellungsgesprächen gerne nach dem Thread-Status.“