Multithreading in Java
Jede Anwendung kann mehrere Prozesse (Instanzen) haben. Jeder dieser Prozesse kann entweder als einzelner Thread oder als mehrere Threads zugewiesen werden. In diesem Tutorial erfahren Sie, wie Sie mehrere Aufgaben gleichzeitig ausfรผhren und erfahren mehr รผber Threads und die Synchronisierung zwischen Threads.
Was ist Single-Thread?
Ein einzelner Thread in Java ist im Grunde genommen ein Leichtgewicht und die kleinste Verarbeitungseinheit. Java verwendet Threads mithilfe einer โThread-Klasseโ. Es gibt zwei Arten von Threads โ Benutzer-Thread und Daemon-Thread (Daemon-Threads werden verwendet, wenn wir die Anwendung bereinigen mรถchten und werden im Hintergrund verwendet). Wenn eine Anwendung zum ersten Mal gestartet wird, wird ein Benutzer-Thread erstellt. Danach kรถnnen wir viele Benutzer-Threads und Daemon-Threads erstellen.
Beispiel fรผr einen einzelnen Thread:
package demotest;
public class GuruThread
{
public static void main(String[] args) {
System.out.println("Single Thread");
}
}
Vorteile von Single-Thread:
- Reduziert den Overhead in der Anwendung, da ein einzelner Thread im System ausgefรผhrt wird
- Auรerdem werden die Wartungskosten der Anwendung reduziert.
Was ist Multithreading in Java?
Multithreading in Java ist ein Prozess, bei dem zwei oder mehr Threads gleichzeitig ausgefรผhrt werden, um die CPU maximal auszulasten. Multithread-Anwendungen fรผhren zwei oder mehr Threads gleichzeitig aus. Daher wird es auch als Parallelitรคt bezeichnet in Java. Jeder Thread lรคuft parallel zu den anderen. Mehrere Threads belegen keinen separaten Speicherbereich und sparen daher Speicher. Auรerdem dauert der Kontextwechsel zwischen Threads weniger Zeit.
Beispiel fรผr Multithread:
package demotest;
public class GuruThread1 implements Runnable
{
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
Vorteile von Multithread:
- Die Benutzer werden nicht blockiert, da die Threads unabhรคngig sind und wir mehrere Vorgรคnge gleichzeitig ausfรผhren kรถnnen.
- Da die Threads unabhรคngig sind, sind die anderen Threads nicht betroffen, wenn ein Thread auf eine Ausnahme trifft.
Thread-Lebenszyklus in Java
Der Lebenszyklus eines Threads:

Es gibt verschiedene Phasen im Lebenszyklus eines Threads, wie im obigen Diagramm dargestellt:
- New
- Lauffรคhig
- Laufen
- Warten
- Dead
- Neu: In dieser Phase wird der Thread mithilfe der Klasse โThread-Klasseโ erstellt. Er bleibt in diesem Zustand, bis das Programm ausgefรผhrt wird beginnt der Faden. Es ist auch als Born Thread bekannt.
- Lauffรคhig: Auf dieser Seite wird die Instanz des Threads mit einer Startmethode aufgerufen. Die Thread-Steuerung wird dem Scheduler รผbergeben, um die Ausfรผhrung abzuschlieรen. Es hรคngt vom Scheduler ab, ob der Thread ausgefรผhrt werden soll.
- Laufen: Wenn die Ausfรผhrung des Threads beginnt, รคndert sich der Status in den Status โWird ausgefรผhrtโ. Der Scheduler wรคhlt einen Thread aus dem Thread-Pool aus und beginnt mit der Ausfรผhrung in der Anwendung.
- Warten: Dies ist der Zustand, in dem ein Thread warten muss. Da in der Anwendung mehrere Threads ausgefรผhrt werden, ist eine Synchronisierung zwischen den Threads erforderlich. Daher muss ein Thread warten, bis der andere Thread ausgefรผhrt wird. Daher wird dieser Zustand als Wartezustand bezeichnet.
- Tot: Dies ist der Zustand, wenn der Thread beendet wird. Der Thread befindet sich im laufenden Zustand und befindet sich, sobald er die Verarbeitung abgeschlossen hat, im โtoten Zustandโ.
Methoden des Multithreading in Java
Einige der hรคufig verwendeten Methoden fรผr Threads sind:| Methodik | Beschreibung |
|---|---|
| Start() | Diese Methode startet die Ausfรผhrung des Threads und JVM ruft die run()-Methode fรผr den Thread auf. |
| Schlaf (int Millisekunden) | Diese Methode versetzt den Thread in den Ruhezustand, sodass die Ausfรผhrung des Threads fรผr die angegebenen Millisekunden angehalten wird und danach erneut mit der Ausfรผhrung des Threads begonnen wird. Dies hilft bei der Synchronisierung der Threads. |
| getName () | Es gibt den Namen des Threads zurรผck. |
| setPriority(int newpriority) | Es รคndert die Prioritรคt des Threads. |
| Ertrag () | Dadurch wird der aktuelle Thread angehalten und andere Threads ausgefรผhrt. |
Ejemplo: In diesem Multithreading-Programm in Java Beispiel: Wir werden einen Thread erstellen und die fรผr Threads verfรผgbaren integrierten Methoden untersuchen.
package demotest;
public class thread_example1 implements Runnable {
@Override
public void run() {
}
public static void main(String[] args) {
Thread guruthread1 = new Thread();
guruthread1.start();
try {
guruthread1.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
guruthread1.setPriority(1);
int gurupriority = guruthread1.getPriority();
System.out.println(gurupriority);
System.out.println("Thread Running");
}
}
Erklรคrung des Codes:
- Code Linie 2: Wir erstellen eine Klasse โthread_Example1โ, die die Runnable-Schnittstelle implementiert (sie sollte von jeder Klasse implementiert werden, deren Instanzen vom Thread ausgefรผhrt werden sollen).
- Code Linie 4: Es รผberschreibt die Ausfรผhrungsmethode der ausfรผhrbaren Schnittstelle, da diese Methode unbedingt รผberschrieben werden muss
- Code Linie 6: Hier haben wir die Hauptmethode definiert, mit der wir die Ausfรผhrung des Threads starten.
- Code Linie 7: Hier erstellen wir einen neuen Thread-Namen als โguruthread1โ, indem wir eine neue Thread-Klasse instanziieren.
- Code Linie 8: Wir werden die โStartโ-Methode des Threads mit der Instanz โguruthread1โ verwenden. Hier beginnt die Ausfรผhrung des Threads.
- Code Linie 10: Hier verwenden wir die โsleepโ-Methode des Threads mit der Instanz โguruthread1โ. Daher schlรคft der Thread 1000 Millisekunden lang.
- Code 9-14: Hier haben wir die Sleep-Methode in den Try-Catch-Block eingefรผgt, da dort eine รผberprรผfte Ausnahme auftritt, dh eine unterbrochene Ausnahme.
- Code Linie 15: Hier setzen wir die Prioritรคt des Threads auf 1, unabhรคngig von der Prioritรคt, die er hatte
- Code Linie 16: Hier erhalten wir die Prioritรคt des Threads mit getPriority()
- Code Linie 17: Hier drucken wir den von getPriority abgerufenen Wert
- Code Linie 18: Hier schreiben wir einen Text, in dem der Thread lรคuft.
Wenn Sie den obigen Code ausfรผhren, erhalten Sie die folgende Ausgabe:
Ausgang:
5 ist die Thread-Prioritรคt und Thread Running ist der Text, der die Ausgabe unseres Codes darstellt.
Java Thread SyncHronisierung
Beim Multithreading kommt es zu einem asynchronen Verhalten der Programme. Wenn ein Thread Daten schreibt und ein anderer Thread gleichzeitig Daten liest, kann dies zu Inkonsistenzen in der Anwendung fรผhren. Wenn zwei oder mehr Threads auf die gemeinsam genutzten Ressourcen zugreifen mรผssen, wird ein Synchronisierungsansatz verwendet. Java hat synchronisierte Methoden zur Implementierung synchronisierten Verhaltens bereitgestellt.
Bei diesem Ansatz kann kein anderer Thread diese Methode fรผr dasselbe Objekt aufrufen, sobald der Thread den synchronisierten Block erreicht hat. Alle Threads mรผssen warten, bis dieser Thread den synchronisierten Block beendet und ihn verlรคsst. Auf diese Weise hilft die Synchronisierung bei einer Multithread-Anwendung. Ein Thread muss warten, bis der andere Thread seine Ausfรผhrung beendet hat, erst dann dรผrfen die anderen Threads ausgefรผhrt werden.
Es kann in der folgenden Form geschrieben werden:
Synchronized(object)
{
//Block of statements to be synchronized
}
Multithreading in Java Beispielprogramme
In diesem Multithreading Java Beispiel: Wir nehmen zwei Threads und holen die Namen der Threads.
Example1:
GuruThread1.java
package demotest;
public class GuruThread1 implements Runnable{
/**
* @param args
*/
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
Erklรคrung des Codes:
- Code Linie 3: Wir haben einen Kurs belegt.GuruThread1โ implementiert Runnable (dies sollte von jeder Klasse implementiert werden, deren Instanzen vom Thread ausgefรผhrt werden sollen).
- Code Linie 8: Dies ist die Hauptmethode der Klasse
- Code Linie 9: Hier instanziieren wir die Thread-Klasse, erstellen eine Instanz mit dem Namen โguruThread1โ und erstellen einen Thread.
- Code Linie 10: Hier instanziieren wir die Thread-Klasse, erstellen eine Instanz mit dem Namen โguruThread2โ und erstellen einen Thread.
- Code Linie 11: Wir starten den Thread, dh guruThread1.
- Code Linie 12: Wir starten den Thread, dh guruThread2.
- Code Linie 13: Ausgabe des Textes als โDie Threadnamen lauten wie folgt:โ
- Code Linie 14: Den Namen von Thread 1 mithilfe der Methode getName() der Thread-Klasse ermitteln.
- Code Linie 15: Den Namen von Thread 2 mithilfe der Methode getName() der Thread-Klasse ermitteln.
Wenn Sie den obigen Code ausfรผhren, erhalten Sie die folgende Ausgabe:
Ausgang:
Thread-Namen werden hier ausgegeben als
- Guru1
- Guru2
Beispiel 2:
In diesem Multithreading in Java Beispiel: Wir lernen, wie man die Methoden run() und start() einer ausfรผhrbaren Schnittstelle รผberschreibt und zwei Threads dieser Klasse erstellt und sie entsprechend ausfรผhrt.
Auรerdem nehmen wir an zwei Kursen teil,
- Eines, das die ausfรผhrbare Schnittstelle implementiert und
- Eine andere, die die Hauptmethode hat und entsprechend ausgefรผhrt wird.
package demotest;
public class GuruThread2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GuruThread3 threadguru1 = new GuruThread3("guru1");
threadguru1.start();
GuruThread3 threadguru2 = new GuruThread3("guru2");
threadguru2.start();
}
}
class GuruThread3 implements Runnable {
Thread guruthread;
private String guruname;
GuruThread3(String name) {
guruname = name;
}
@Override
public void run() {
System.out.println("Thread running" + guruname);
for (int i = 0; i < 4; i++) {
System.out.println(i);
System.out.println(guruname);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread has been interrupted");
}
}
}
public void start() {
System.out.println("Thread started");
if (guruthread == null) {
guruthread = new Thread(this, guruname);
guruthread.start();
}
}
}
Erklรคrung des Codes:
- Code Linie 2: Hier nehmen wir an einem Kurs teil.GuruThread2โ, der die Hauptmethode enthรคlt.
- Code Linie 4: Hier nehmen wir eine Hauptmethode der Klasse.
- Code Zeile 6-7: Hier erstellen wir eine Instanz der Klasse GuruThread3 (der in den folgenden Codezeilen erstellt wird) heiรt โthreadguru1โ und wir starten den Thread.
- Code Zeile 8-9: Hier erstellen wir eine weitere Instanz der Klasse GuruThread3 (der in den folgenden Codezeilen erstellt wird) heiรt โthreadguru2โ und wir starten den Thread.
- Code Linie 11: Hier erstellen wir eine Klasse โGuruThread3โ implementiert das Runnable-Interface (es sollte von jeder Klasse implementiert werden, deren Instanzen vom Thread ausgefรผhrt werden sollen).
- Code Zeile 13-14: Wir nehmen zwei Klassenvariablen, von denen eine vom Typ Thread-Klasse und die andere vom Typ String-Klasse ist.
- Code Zeile 15-18: Wir setzen die GuruDer Thread3-Konstruktor nimmt ein Argument vom Typ String entgegen (den Namen des Threads), das der Klassenvariablen guruname zugewiesen wird, wodurch der Name des Threads gespeichert wird.
- Code Linie 20: Hier รผberschreiben wir die run()-Methode der ausfรผhrbaren Schnittstelle.
- Code Linie 21: Wir geben den Thread-Namen mit der println-Anweisung aus.
- Code Zeile 22-31: Hier verwenden wir eine for-Schleife mit einem auf 0 initialisierten Zรคhler, der nicht kleiner als 4 sein sollte (wir kรถnnen jede beliebige Zahl annehmen, daher wird die Schleife hier viermal ausgefรผhrt) und erhรถhen den Zรคhler. Wir geben den Thread-Namen aus und sorgen dafรผr, dass der Thread innerhalb eines Try-Catch-Blocks 4 Millisekunden lang in den Ruhezustand versetzt wird, da die Sleep-Methode eine geprรผfte Ausnahme auslรถst.
- Code Linie 33: Hier รผberschreiben wir die Startmethode der ausfรผhrbaren Schnittstelle.
- Code Linie 35: Wir geben den Text โThread gestartetโ aus.
- Code Zeile 36-40: Hier verwenden wir eine if-Bedingung, um zu prรผfen, ob die Klassenvariable guruthread einen Wert enthรคlt oder nicht. Wenn es null ist, erstellen wir eine Instanz mithilfe der Thread-Klasse, die den Namen als Parameter verwendet (der Wert wurde im Konstruktor zugewiesen). Danach wird der Thread mit der Methode start() gestartet.
Wenn Sie den obigen Code ausfรผhren, erhalten Sie die folgende Ausgabe:
Ausgang:
Da es zwei Threads gibt, erhalten wir zweimal die Meldung โThread gestartetโ.
Wir erhalten die Namen der Threads so, wie wir sie ausgegeben haben.
Es geht in die for-Schleife, in der wir den Zรคhler und den Thread-Namen drucken und der Zรคhler mit 0 beginnt.
Die Schleife wird dreimal ausgefรผhrt und dazwischen ruht der Thread fรผr 1000 Millisekunden.
Daher erhalten wir zuerst Guru1, dann Guru2 und dann noch einmal Guru2, weil der Thread hier 1000 Millisekunden lang schlรคft, und dann folgt Guru1 und wieder Guru1, der Thread schlรคft 1000 Millisekunden lang, also erhalten wir Guru2 und dann Guru1.
Zusammenfassung
In diesem Tutorial haben wir Multithread-Anwendungen gesehen in Java und wie man Single- und Multi-Thread verwendet in Java.
- Erklรคren Sie Multithreading in Java: Beim Multithreading werden Benutzer nicht blockiert, da Threads unabhรคngig sind und mehrere Vorgรคnge gleichzeitig ausfรผhren kรถnnen
- Verschiedene Phasen des Lebenszyklus des Threads sind:
- New
- Lauffรคhig
- Laufen
- Warten
- Dead
- Wir haben auch davon erfahren Synchronisation zwischen Threads, die dazu beitragen, dass die Anwendung reibungslos lรคuft.
- Multithread-Programmierung in Java erleichtert viele weitere Anwendungsaufgaben.



