Einführung in den Thread-Lebenszyklus in Java

Ein Thread erlebt zahlreiche Phasen im Lebenszyklus. Wie kommt ein Faden in die Welt, begann, läuft, und danach vergeht. Das nachfolgende Diagramm erläutert den gesamten Lebenszyklus des Threads.

  • Thread Constructor erzeugt einen Thread durch einen neuen Zustand.
  • Wenn Sie begin aufrufen, kann die Methode in Thread den ausführbaren Status durchlaufen.
  • Thread Scheduler für Java führt diesen Thread aus, wenn der Prozessor ihn empfängt.
  • Wenn der Thread in einen blockierten Zustand versetzt wird, wird er erneut ausgeführt, da er wieder in einen ausführbaren Zustand versetzt wird.
  • Wenn die Wartemethode als Thread bezeichnet wird, der auf den Status wartet, wird der Status bald nach der Benachrichtigung über die gesamte Inform-Methode und die Benachrichtigungsmethode "Alle benachrichtigen" aktiviert.
  • Der Thread endet, sobald die Ausführungsmethode beendet ist.

Was ist Thread?

Ein Thread wird auf Betriebssystemebene definiert. Die Java-Sprache sowie alle anderen Sprachen nutzen den vom Betriebssystem bereitgestellten Service. Aus der Sicht des Entwicklers ist ein Thread eine Reihe von Anweisungen, die wir für unsere Anwendung schreiben und auf eine bestimmte Weise ausführen werden. Eine Anwendung selbst kann aus mehreren Threads bestehen. Es können verschiedene Threads gleichzeitig ausgeführt werden. Die JVM (Java Virtual Machine) arbeitet mit mehreren Threads. Es gibt Threads für die Garbage Collection. Es gibt Threads für den Just in Time Compiler und andere technische Threads.

Status des Thread-Lebenszyklus in Java

Nachfolgend sind die verschiedenen Zustände des Thread-Lebenszyklus in Java aufgeführt:

1. Neu: Ein neuer Thread beginnt seinen Lebenszyklus im neuen Zustand. Es bleibt in diesem Zustand, bevor das Programm den Thread startet. Außerdem wird es als erstellter Thread bezeichnet.

2. Runnable: Nachdem ein kürzlich geborener Thread beginnen kann, verwandelt sich der Thread in Runnable. Ein Thread mit diesem Status führt seinen Prozess aus.

3. Warten: Gelegentlich ein Thread-Übergang zum Warten um den Status, obwohl der Thread darauf wartet, dass ein anderer Thread eine Aktivität ausführt. Ein Thread wechselt nur dann in den ausführbaren Zustand, wenn ein zusätzlicher Thread angibt, dass der wartende Thread weiterhin ausgeführt werden soll.

4. Zeitgesteuertes Warten: Ein ausführbarer Thread kann auf einfache Weise die zeitgesteuerte Wartezeit festlegen, die der Status benötigt, um ein bestimmtes Zeitintervall zu erhalten. Ein Thread mit diesen Statusübergängen kehrt in den ausführbaren Status zurück, sobald dieses Punktintervall abgelaufen ist oder wenn das tatsächlich erwartete Ereignis eintritt.

5. Abgebrochen: Ein ausführbarer Thread wird abgebrochen, weil er seine Aufgabe erfüllt oder sonst abgebrochen wird.

Wie erstelle ich einen Thread in Java?

Die einfachste Methode zum Erstellen eines Threads in Java ist die Verwendung des ausführbaren Musters. Sie müssen zunächst eine Instanz der Runnable-Schnittstelle erstellen, was sehr einfach ist. Es gibt nur eine Methode zu implementieren. Dann übergeben wir diese Instanz an den Konstruktor der Thread-Klasse. Und dann rufen wir einfach die start () -Methode dieses erstellten Thread-Objekts auf, um einen neuen Thread zu starten, der die in unser Runnable-Objekt eingeschlossene Aufgabe ausführt.

Also erstellen wir zuerst eine Instanz eines Runnable. Es ist nur eine Methode zu implementieren, die run () -Methode. Dies ist das Java 7-Muster, um dies mit einer Instanz einer anonymen Klasse zu tun. Wir können aber auch einen Lambda-Ausdruck verwenden, um ein Runnable zu implementieren, da es nur eine Methode in der Runnable-Schnittstelle gibt.

Lassen Sie uns Threads zu sehr einfachen Beispielen erstellen

Wir werden sehen, was bei einer Racebedingung mit nicht synchronisiertem Code, der synchronisiert werden sollte, schief gehen kann, und wir werden unseren Code mithilfe der Synchronisierung korrigieren. Dieses erste Beispiel ist sehr einfach, es ist sehr einfach. Es geht nur darum, eine Aufgabe zu erstellen.

Ausgabe:

Eine Task ist eine Instanz der Runnable-Schnittstelle, nennen wir sie Runnable, und wir können diese Schnittstelle mithilfe eines Lambda-Ausdrucks implementieren. Diese Aufgabe wird an einen neuen Thread übergeben und im Kontext dieses Threads ausgeführt. Wir werden also nur den Namen des Threads ausdrucken, der diese Aufgabe ausführt. Ich laufe in … Thread.currentThread () ist eine statische Methode der Thread-Klasse, die den Thread zurückgibt, in dem die aktuelle Aufgabe ausgeführt wird. Und wir müssen nur getName () für dieses Thread-Objekt aufrufen, um den Namen eines Threads zurückzugeben. Dann, nachdem wir eine Thread-Instanz erstellt haben, ist t = neuer Thread. Übergeben dieses ausführbaren als Parameter. Also wird dieser Thread diesen Teil des Codes ausführen. Und um es zu starten. t.start () Dies ist die start () -Methode, die wir aufrufen müssen. Wir können diesen Thread auch explizit mit t.setName („Mein Thread“) benennen. Und jetzt können wir diesen Code ausführen. Anstelle der Methode call start () rufen wir jetzt die Methode run () auf. Wenn wir diesen Code ausführen, besteht das Problem darin, dass die Aufgabe korrekt ausgeführt wird, jedoch nicht in dem von uns erstellten Thread. Es wird im Hauptthread ausgeführt, der den Thread darstellt, der die Hauptmethode ausführt. Daher sollte diese run () -Methode nicht aufgerufen werden, wenn ein neuer Thread gestartet werden soll.

Ausgabe:

Methoden des Thread-Lebenszyklus in Java

Die von simply Thread beschriebenen Methoden sind in der Tabelle dargestellt.

DatentypenThread-Methodennamen
String

getName ()

Geben Sie den Namen dieses Threads zurück

intPriorität bekommen ()

Gibt die Priorität des Threads zurück

Boolescher Wertist am Leben()

Testet, ob dieser Thread noch läuft

Leerebeitreten()

Wartet, bis dieser Thread beendet ist

LeereLauf()

Wann immer dieser Thread unter Verwendung eines einzelnen ausführbaren Objekts erstellt wurde, wird danach die Ausführungsmethode des ausführbaren Objekts aufgerufen. Andernfalls gibt diese Methode nichts und auch nichts zurück. Wenn die Thread-Klasse erweitert werden kann und die run () -Methode während der Unterklasse überschrieben wird, wird eine überschriebene run () -Methode aufgerufen.

LeeresetName ( String name )

Ändert den Namen mit diesem Thread, um mit dem Argumentnamen vergleichbar zu werden.

Statische Leere

Schlaf ( lange Millis ) wirft Interrupted / Exception
Bewirkt, dass der aktuell ausgeführte Thread ruht
die erforderliche Anzahl von Millisekunden.
Statische Leeresleep ( long millis, int nanos ) löst InterruptedException aus

Es bewirkt, dass der aktuell ausgeführte Thread für die erforderliche Anzahl von Millisekunden sowie für die bestimmte Anzahl von Nanosekunden in den Ruhezustand wechselt (die Ausführung einstellt).

LeereStart()

Löst die Ausführung dieser Threads aus. Die Java Virtual Machine ruft die Ausführungsmethode dieses Threads auf.

Statische LeereAusbeute()

Löst aus, dass das aktuelle Thread-Objekt kurz anhält und die Ausführung weiterer Threads zulässt.

statischer ThreadcurrentThread ()

Gibt eine Erwähnung des aktuell ausgeführten Thread-Objekts zurück.

Fazit

  • Einfach mit der Verwendung von Fäden zu beginnen, extrem schwer zu fassen.
  • Das Entwerfen von Klassen mit Methoden, die threadsicher sein können, ist eine Herausforderung.
  • Lesen Sie: JavaDoc, um die Klasse java.lang.Thread abzurufen

Empfohlener Artikel

Dies war ein Leitfaden für den Thread-Lebenszyklus in Java. Hier diskutieren wir, was Thread ist? und verschiedene Zustände des Thread-Lebenszyklus zusammen mit der Erstellung von Threads in Java. Sie können auch unsere anderen Artikelvorschläge durchgehen, um mehr zu erfahren -

  1. Frameworks In Java
  2. Sternchenmuster in Java
  3. Sortierung in Java zusammenführen
  4. Beste Java-Compiler
  5. Statische Methode in PHP