Auf der Betriebssystemebene hat jeder Thread im Allgemeinen fünf Zustände, nämlich Erstellung, Bereit, Ausführung, Blockiert und Beendet.
(1) Neuer Status (NEU)
Wenn ein neuer Thread mit einer Konstruktormethode im Programm erstellt wird, z. B. new Thread(), befindet sich der Thread zu diesem Zeitpunkt bereits im Erstellungsstatus Speicherplatz und andere Ressourcen wurden jedoch noch nicht ausgeführt.
(2) Bereitschaftszustand (READ)
Das Starten eines Threads kann durch Aufrufen der start()-Methode des neu erstellten Thread-Objekts erreicht werden. Wenn der Thread startet, wechselt er in den Bereitschaftszustand (ausführbar)
Der Thread hat die Betriebsbedingungen, aber da die CPU noch nicht zugewiesen wurde, tritt er in die Thread-Warteschlange ein und wartet in die Warteschlange, um auf den CPU-Dienst zu warten. Sobald das System ein auszuführendes Thread-Objekt auswählt, wechselt das Objekt vom Wartezustand in den Ausführungszustand. Die vom System ausgewählten Aktionen werden als „CPU-Scheduling“ bezeichnet. Wenn der Thread die CPU erhält, wechselt er in den Ausführungsstatus und führt automatisch seine eigene Ausführungsmethode aus.
(3) Ausführungszustand (RUNNING)
Ein Thread wechselt in den Ausführungszustand, wenn ein Thread im Bereitschaftszustand aufgerufen wird und Prozessorressourcen belegt. Zu diesem Zeitpunkt wird die run()-Methode des Thread-Objekts automatisch aufgerufen.
(4) Blockierter Zustand (BLOCKIERT)
Ein ausführender Thread wird die CPU aufgeben und seine Ausführung unter bestimmten besonderen Umständen vorübergehend unterbrechen, z. B. wenn er künstlich angehalten wird oder zeitaufwendige Eingabe- und Ausgabevorgänge ausführen muss Sperrzustand.
Wenn Sie im ausführbaren Zustand Sleep(), Suspend(), Wait() und andere Methoden verwenden, wird der Thread blockiert. Wenn der Thread blockiert ist, kann er nicht in die Warteschlange gelangen. Erst wenn die Ursache der Blockierung behoben ist, wechselt er in den Bereitschaftsstatus und kehrt zum Warten in die Bereitschaftswarteschlange zurück. Zu diesem Zeitpunkt wird er fortgesetzt, nachdem er vom CPU-Zeitplan ausgewählt wurde Ausführung aus der ursprünglich gestoppten Position.
Denken Sie daran: Nachdem die Blockade beseitigt ist, kehrt es in den Bereitschaftszustand zurück, nicht in den Betriebszustand.
(5) TERMINATED
Wenn ein Thread stop(), destroy() oder run() aufruft und die Ausführung abschließt, befindet sich der Thread im Endzustand. Ein Thread in einem toten Zustand kann nicht weiter ausgeführt werden.
Der Lebenszyklus eines Threads in Java ist in 6 Zustände unterteilt. Die Thread-Klasse verfügt über eine Instanzeigenschaft und eine Instanzmethode, die speziell zum Speichern und Abrufen des Thread-Status verwendet werden. Unter diesen sind die Instanzattribute, die zum Speichern des Thread-Thread-Instanzstatus verwendet werden:
// 以整数的形式保存线程的状态 private volatile int threadStatus = 0; // 返回当前线程的状态,一个枚举类型值 public State getState() { return sun.misc.VM.toThreadState(threadStatus); }
Thread.State ist eine interne Aufzählungsklasse, die 6 Aufzählungskonstanten definiert, die die 6 Zustände von Java-Threads wie folgt darstellen:
public enum State { // 新建状态 NEW, // 运行状态 RUNNABLE, /** * 阻塞状态 * Object.wait */ BLOCKED, /** * 等待状态 * Object.wait * Thread.join * LockSupport.park */ WAITING, /** * 限时等待状态 * Thread.sleep * Object.wait * Thread.join * LockSupport.parkUntil * LockSupport.parkNanos */ TIMED_WAITING, // 终止状态 TERMINATED; }
Es gibt vier Häufige Zustände sind: NEW-Zustand (neu), RUNNABLE-Zustand (ausführbare Datei), TERMINATED-Zustand (beendet) und TIMED_WAITING-Zustand (zeitlich begrenztes Warten).
(1) NEUER Zustand
Der Java-Quellcode erklärt den NEUEN Zustand wie folgt: Thread-Thread-Instanzen, die erfolgreich erstellt, aber nicht durch Aufruf der start()-Methode gestartet wurden, befinden sich im NEUEN Zustand.
Sobald die start()-Methode einer Thread-Thread-Instanz aufgerufen wird, ändert sich ihr Status natürlich vom Status „NEW“ in den Status „RUNNABLE“. Dies bedeutet nicht, dass der Thread sofort die CPU-Zeitscheibe erhält und diese sofort ausführt Dazwischen sind viele Betriebssystemoperationen erforderlich.
(2) RUNNABLE-Status
Wenn der Thread nach dem Aufruf der start()-Methode der Thread-Instanz die CPU-Zeitscheibe erhält und im nächsten Schritt mit der Ausführung beginnt, ruft die JVM asynchron die run()-Methode des Threads auf um seinen Geschäftscode auszuführen. Was hat die JVM also getan, bevor die run()-Methode asynchron aufgerufen wurde? Wenn die start()-Methode der Thread-Instanz eines Java-Threads aufgerufen wird, wechselt der entsprechende Thread im Betriebssystem nicht in den Betriebszustand, sondern in den Bereitschaftszustand, und der Java-Thread verfügt nicht über diesen Bereitschaftszustand. Wie ist der Bereitschaftsstatus von Threads im Betriebssystem? Die Konvertierungsbeziehung zwischen dem Thread-Status der JVM und dem Status des Betriebssystem-Threads hinter den Kulissen wird wie folgt vereinfacht:
Wenn sich ein Betriebssystem-Thread im Bereitschaftszustand befindet, bedeutet dies, dass „alles bereit ist“. Alles, was wir brauchen, ist der Ostwind“, also der Thread. Die Ausführungsbedingungen sind erfüllt, aber die Ausführung kann noch nicht erfolgen. Der Thread im Bereitschaftszustand muss auf die Systemplanung warten. Sobald das System den Bereitschaftszustand ausgewählt hat und die CPU-Zeitscheibe erhält, beginnt der Thread, die CPU zu belegen und beginnt mit der Ausführung des Thread-Codes Der Betriebssystemstatus des Threads ändert sich und wechselt in den Ausführungsstatus.
Wenn der laufende Thread im Betriebssystem die CPU-Zeitscheibe verbraucht, kehrt er in den Bereitschaftszustand zurück und wartet auf die nächste CPU-Planung. Auf diese Weise wird der Betriebssystem-Thread vom System wiederholt zwischen dem Bereitschaftsstatus und dem Ausführungsstatus geplant. Diese Situation bleibt bestehen, bis die Codelogikausführung des Threads abgeschlossen ist oder der Thread abnormal beendet wird. Zu diesem Zeitpunkt hat sich der Betriebssystemstatus des Threads erneut geändert und ist in den Endstatus des Threads eingetreten – den Status TERMINATED.
Bereitsstatus und Ausführungsstatus sind beide Thread-Status im Betriebssystem. In der Java-Sprache werden diese beiden Zustände nicht unterteilt, sondern zu demselben Zustand zusammengeführt – dem RUNNABLE-Zustand. Daher sind in der Aufzählungsklasse Thread.State nicht der Bereitschaftsstatus und der Ausführungsstatus des Threads definiert, sondern nur der RUNNABLE-Status. Hier unterscheidet sich der Java-Thread-Status vom Thread-Status im Betriebssystem.
Wenn sich die Thread-Instanz im NEW-Status befindet, wechselt der Thread nach Aufruf der start()-Methode in den RUNNABLE-Status. Trotzdem kann es sein, dass die run()-Methode des Threads nicht sofort gleichzeitig ausgeführt wird, nachdem der Thread die CPU-Zeitscheibe erhalten hat.
(3) TERMINATED-Zustand
Wenn der Thread im RUNNABLE-Zustand die Ausführung der run()-Methode beendet, wechselt er in den Beendigungszustand TERMINATED. Wenn während der Ausführung der run()-Methode eine Laufzeitausnahme auftritt und nicht abgefangen wird, wird die run()-Methode natürlich abnormal beendet und der Thread wird ebenfalls TERMINATED.
(4) TIMED_WAITING-Zustand
Der Thread befindet sich in einem speziellen Wartezustand. Genauer gesagt befindet sich der Thread in einem zeitlich begrenzten Wartezustand. Die Operationen, die einen Thread in einen zeitlich begrenzten Wartezustand versetzen können, sind ungefähr wie folgt:
Thread.sleep(int n): bewirkt, dass der aktuelle Thread in a eintritt Zeitlich begrenzter Wartezustand, und die Wartezeit beträgt n Millisekunden.
Object.wait(): Verhindert die Monitorsperre des Objekts mit einem Zeitlimit.
Thread.join(): Zeitlich begrenzte Thread-Zusammenführung.
LockSupport.parkNanos(): Lassen Sie den Thread warten, die Zeit wird in Nanosekunden angegeben.
LockSupport.parkUntil(): Lassen Sie den Thread warten, und die Zeit kann flexibel eingestellt werden.
Das obige ist der detaillierte Inhalt vonWas sind die fünf Zustände von Java-Threads?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!