Java-Beispiele - Thread-Zustand abrufen

Java 实例Java-Beispiele

Im Lebenszyklus eines Java-Threads besitzt die Klasse Thread einen Enumerationstyp State, der mehrere Thread-Zustände definiert, nämlich:

  • Neu
  • Ausführbar
  • Blockiert
  • Wartend
  • Zeitlich begrenzt wartend
  • Beendet

Beschreibung der einzelnen Zustände:

1. Anfangszustand - NEW

Deklaration:

public static final Thread.State NEW

Durch Implementieren des Runnable-Interface und Erweitern von Thread kann eine Thread-Klasse erzeugt werden. Wenn eine Instanz mit new erzeugt wird, geht der Thread in den Anfangszustand über.

2. RUNNABLE

Deklaration:

public static final Thread.State RUNNABLE

2.1. Bereit-Zustand

Der Bereit-Zustand bedeutet einfach, dass man lauffähig ist. Wenn der Scheduler einen nicht auswählt, verbleibt man immer im Bereit-Zustand.

Der Aufruf der start()-Methode des Threads versetzt den Thread in den Bereit-Zustand.

Wenn die sleep()-Methode des aktuellen Threads endet, ein join() eines anderen Threads endet, das Warten auf Benutzereingaben abgeschlossen ist oder ein Thread den Objekt-Lock erhält, gehen diese Threads ebenfalls in den Bereit-Zustand über.

Wenn der aktuelle Thread seine Zeitscheibe aufgebraucht hat oder die yield()-Methode für den aktuellen Thread aufgerufen wird, geht der aktuelle Thread in den Bereit-Zustand über.

Nachdem ein Thread im Lock-Pool den Objekt-Lock erhalten hat, geht er in den Bereit-Zustand über.

2.2. Laufender Zustand

Der Zustand, in dem sich ein Thread befindet, wenn der Thread-Scheduler ihn aus dem Pool der ausführbaren Threads als aktuellen Thread auswählt. Dies ist auch der einzige Weg, wie ein Thread in den laufenden Zustand eintritt.

3. Blockierter Zustand - BLOCKED

Deklaration:

public static final Thread.State BLOCKED

Der blockierte Zustand ist der Zustand, wenn ein Thread blockiert wird, während er eine Methode oder einen Codeblock betritt, der durch das Schlüsselwort synchronized modifiziert wurde (Erwerb einer Sperre).

4. Warten - WAITING

Deklaration:

public static final Thread.State WAITING

Threads in diesem Zustand wird keine CPU-Ausführungszeit zugewiesen. Sie müssen warten, bis sie explizit aufgeweckt werden, andernfalls befinden sie sich in einem Zustand des unbegrenzten Wartens.

5. Zeitgesteuertes Warten - TIMED_WAITING

Deklaration:

public static final Thread.State TIMED_WAITING

Threads in diesem Zustand wird keine CPU-Ausführungszeit zugewiesen, aber sie müssen nicht unbegrenzt warten, um von anderen Threads explizit aufgeweckt zu werden; nach einer bestimmten Zeit werden sie automatisch aufgeweckt.

6. Beendeter Zustand - TERMINATED

Deklaration:

public static final Thread.State TERMINATED

Wenn die run()-Methode eines Threads abgeschlossen ist oder die main()-Methode des Hauptthreads abgeschlossen ist, betrachten wir ihn als beendet. Das Thread-Objekt kann noch am Leben sein, aber es ist kein separater ausführender Thread mehr. Sobald ein Thread beendet ist, kann er nicht wiederbelebt werden.

Der Aufruf der start()-Methode auf einem beendeten Thread löst eine java.lang.IllegalThreadStateException aus.

Das folgende Beispiel zeigt, wie man den Zustand eines Threads abruft:

Main.java-Datei

//Java-Programm - Demonstration des Thread-Zustands class thread implements Runnable { public void run() { //thread2 - Zeitgesteuertes Warten try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Zustand von thread1, während es die Methode join() auf thread2 aufgerufen hat -"+ Test.thread1.getState()); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public class Test implements Runnable { public static Thread thread1; public static Test obj; public static void main(String[] args) { obj = new Test(); thread1 = new Thread(obj); //thread1 erstellt, jetzt befindet er sich im Anfangszustand System.out.println("Zustand von thread1 nach dem Erstellen - " + thread1.getState()); thread1.start(); //thread1 - Bereit-Zustand System.out.println("Zustand von thread1 nach Aufruf der .start()-Methode darauf - " + thread1.getState()); } public void run() { thread myThread = new thread(); Thread thread2 = new Thread(myThread); //thread1 erstellt, jetzt befindet er sich im Anfangszustand System.out.println("Zustand von thread2 nach dem Erstellen - "+ thread2.getState()); thread2.start(); //thread2 - Bereit-Zustand System.out.println("Zustand von thread2 nach Aufruf der .start()-Methode darauf - " + thread2.getState()); // thread1 in den zeitlich begrenzten Wartezustand versetzen try { //Verschieben - Zeitlich begrenztes Warten Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Zustand von thread2 nach Aufruf der .sleep()-Methode darauf - "+ thread2.getState() ); try { //Warten darauf, dass thread2 beendet wird thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Zustand von thread2, wenn die Ausführung beendet ist - " + thread2.getState()); } }

Die Ausgabe des obigen Codes ist:

State of thread1 after creating it - NEW
State of thread1 after calling .start() method on it - RUNNABLE
State of thread2 after creating it - NEW
State of thread2 after calling .start() method on it - RUNNABLE
State of thread2 after calling .sleep() method on it - TIMED_WAITING
State of thread1 while it called join() method on thread2 -WAITING
State of thread2 when it has finished it's execution - TERMINATED

Java 实例Java-Beispiele

Andere Erweiterungen