Java Thread State Einführung mit Beispiel – Lebenszyklus eines Threads

Veröffentlicht: 2019-01-11
Einführung in den Java-Thread-Status mit Beispiel

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.

Java-Thread-Status mit Beispiel

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.

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:

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

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() oder notifyAll() .
  • Wenn ein Thread bei der E/A blockiert ist, muss der angegebene E/A-Befehl abgeschlossen werden.
Java-Thread-Tutorial

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.

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.

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.