Java Thread State Einführung mit Beispiel – Lebenszyklus eines Threads
Veröffentlicht: 2019-01-11
Thread-Zustände
Das folgende Diagramm veranschaulicht die verschiedenen Zustände, in denen sich ein Java-Thread zu einem beliebigen Zeitpunkt während seines Lebens befinden kann, und welche Methodenaufrufe einen Übergang in einen anderen Zustand bewirken. Dieses Diagramm ist kein vollständiges Finite-State-Diagramm, sondern eher ein Überblick über die interessanteren und gemeinsamen Facetten des Lebens eines Fadens.
Sie sind an der richtigen Stelle, wenn Sie eine der folgenden Fragen haben:
- Lebenszyklus eines Threads in Java
- Lebenszyklus und Zustände eines Threads in Java
- Java-Thread-Zustände verstehen
Der Rest dieser Seite behandelt Thread's life cycle
in Bezug auf seinen Zustand.

Neues Thema
Die folgende Anweisung erstellt einen neuen Thread, startet ihn jedoch nicht, wodurch der Thread in dem Zustand belassen wird, der im Diagramm als Neuer Thread gekennzeichnet ist.
1 |
Thread myThread = new MyThreadClass ( ) ; |
Wenn sich ein Thread im Status „ New Thread
“ befindet, ist er lediglich ein leeres Thread-Objekt. Es wurden noch keine Systemressourcen dafür zugewiesen. Wenn sich also ein Thread in diesem Zustand befindet, können Sie den Thread nur starten oder stoppen; Das Aufrufen einer anderen Methode außer start()
oder stop()
wenn sich ein Thread in diesem Zustand befindet, macht keinen Sinn und verursacht eine IllegalThreadStateException.
Lauffähig
Betrachten Sie nun diese beiden Codezeilen:
1 2 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; |
Die Methode start()
erstellt die zum Ausführen des Threads erforderlichen Systemressourcen, plant die Ausführung des Threads und ruft die Methode run()
des Threads auf. An diesem Punkt befindet sich der Thread im Zustand „Runnable“. Dieser Zustand wird als „Runnable“ und nicht als „Running“ bezeichnet, da der Thread möglicherweise nicht ausgeführt wird, wenn er sich in diesem Zustand befindet. Viele Computer haben einen einzigen Prozessor, was es unmöglich macht, alle „ausführbaren“ Threads gleichzeitig auszuführen.
Daher muss das Java-Laufzeitsystem ein Scheduling-Schema implementieren, das den Prozessor zwischen allen „ausführbaren“ Threads teilt. Für die meisten Zwecke können Sie sich den Zustand „Runnable“ jedoch einfach als „Running“ vorstellen. Wenn ein Thread läuft – er ist „ausführbar“ und der aktuelle Thread – werden die Anweisungen in seinem run()
sequentiell ausgeführt.
Nicht lauffähig
Ein Thread wechselt in den Zustand Not Runnable
, wenn eines dieser vier Ereignisse eintritt:
- jemand ruft seine
suspend()
Methode auf - jemand ruft seine
sleep()
Methode auf - Der Thread verwendet seine Methode
wait()
, um auf eine Bedingungsvariable zu warten - Der Thread blockiert die E/A.
Beispielsweise die fette Linie in diesem Code-Snippet
1 2 3 4 5 6 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; try { myThread . sleep ( 10000 ) ; } catch ( InterruptedException e ) { } |
versetzt myThread
für 10 Sekunden (10.000 Millisekunden) in den Ruhezustand. Während dieser 10 Sekunden würde myThread
nicht ausgeführt, selbst wenn der Prozessor verfügbar würde. Nachdem die 10 Sekunden abgelaufen sind, wird myThread
wieder „Runnable“ und jetzt, wenn der Prozessor verfügbar wäre, würde myThread
laufen.
Für jeden der oben aufgeführten „Eingänge“ in den Zustand „Nicht lauffähig“ gibt es einen spezifischen und eindeutigen Fluchtweg, der den Thread in den Zustand „Ausführbar“ zurückführt. Ein Fluchtweg funktioniert nur für den entsprechenden „Eingang“. Wenn beispielsweise ein Thread in den Ruhezustand versetzt wurde, muss die angegebene Anzahl von Millisekunden vergehen, bevor der Thread wieder „Runnable“ wird. Das Aufrufen von resume()
in einem schlafenden Thread hat keine Auswirkung.
Im Folgenden wird der Fluchtweg für jeden Eintritt in den „Not Runnable“-Zustand angegeben.
- Wenn ein Thread in den Ruhezustand versetzt wurde, muss die angegebene Anzahl von Millisekunden vergehen.
- Wenn ein Thread angehalten wurde, muss jemand seine
resume()
Methode aufrufen. - Wenn ein Thread auf eine Bedingungsvariable wartet, muss das Objekt, dem die Variable gehört, sie durch Aufrufen von translate(
notify()
odernotifyAll()
. - Wenn ein Thread bei der E/A blockiert ist, muss der angegebene E/A-Befehl abgeschlossen werden.

Tot
Ein Thread kann auf zwei Arten sterben: entweder durch natürliche Ursachen oder durch Töten (Stoppen). Ein Thread stirbt auf natürliche Weise, wenn seine Methode run()
normal beendet wird. Beispielsweise ist die while
-Schleife in dieser Methode eine endliche Schleife – sie wird 100 Mal durchlaufen und dann beendet.

1 2 3 4 5 6 7 |
public void run ( ) { int i = 0 ; while ( i < 100 ) { i ++ ; System . out . println ( "i = " + i ) ; } } |
Ein Thread mit dieser run()
Methode stirbt auf natürliche Weise, nachdem die Schleife und die run()
Methode abgeschlossen sind.
Sie können einen Thread auch jederzeit beenden, indem Sie seine Methode stop()
aufrufen. Dieses Code-Snippet.
1 2 3 4 5 6 7 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; try { Thread . currentThread ( ) . sleep ( 10000 ) ; } catch ( InterruptedException e ) { } myThread . stop ( ) ; |
erstellt und startet myThread
und versetzt dann den aktuellen Thread für 10 Sekunden in den Ruhezustand. Wenn der aktuelle Thread aufwacht, beendet die fette Linie im Codesegment myThread
.
Die Methode stop()
wirft ein ThreadDeath-Objekt auf den Thread, um ihn zu beenden. Wenn also ein Thread auf diese Weise beendet wird, stirbt er asynchron. Der Thread stirbt, wenn er tatsächlich die ThreadDeath-Ausnahme erhält.
IllegalThreadStateException
Das Laufzeitsystem löst eine IllegalThreadStateException aus, wenn Sie eine Methode für einen Thread aufrufen und der Zustand dieses Threads diesen Methodenaufruf nicht zulässt. Beispielsweise wird IllegalThreadStateException ausgelöst, wenn Sie suspend()
für einen Thread aufrufen, der nicht „Runnable“ ist.
Wie in den verschiedenen Beispielen für Threads bisher in dieser Lektion gezeigt wurde, müssen Sie beim Aufrufen einer Thread-Methode, die eine Ausnahme auslösen kann, entweder die Ausnahme abfangen und behandeln oder deklarieren, dass die aufrufende Methode die nicht abgefangene Ausnahme auslöst.
Die isAlive()-Methode
Und noch ein letztes Wort zum Thread-Status: Die Programmierschnittstelle für die Thread-Klasse enthält eine Methode namens isAlive()
. isAlive()
gibt true zurück, wenn der Thread gestartet und nicht gestoppt wurde. Wenn also die Methode isAlive()
false zurückgibt, wissen Sie, dass der Thread entweder ein „neuer Thread“ oder „tot“ ist.
Wenn die Methode isAlive()
true zurückgibt, wissen Sie, dass der Thread entweder „Runnable“ oder „Not Runnable“ ist. Sie können nicht zwischen einem „neuen Thread“ und einem „toten“ Thread unterscheiden; Sie können auch nicht zwischen einem „Runnable“-Thread und einem „Not Runnable“-Thread unterscheiden.
Beim Betrachten komplexer Thread-Beispiele fand ich dieses wirklich großartige Tutorial im Netz. Jeder sollte dies sorgfältig lesen.