Multithreading in Java erklärt [mit Beispielen]
Veröffentlicht: 2021-06-15Inhaltsverzeichnis
Threads in Java
Threads in Java unterstützen den effizienten Betrieb eines Programms. Die beiden grundlegenden Ausführungseinheiten von Proforma sind der Prozess und die Threads. Ein Prozess kann eine Anwendung, ein Programm oder eine eigenständige Ausführungsumgebung sein.
Während Threads eine Ressource mit der des Prozesses teilen und mit ihr existieren. In jeder Java-Anwendung ist mindestens ein Thread vorhanden, der Haupt-Thread genannt wird. Aus dem Hauptthread können mehrere Threads erstellt werden. Erfahren Sie mehr darüber, wie Sie einen Thread in Java erstellen.
Vorteile von Java-Thread
- Im Vergleich zu Prozessen werden weniger Zeit und Ressourcen benötigt, um einen Thread zu erstellen. Daher werden Threads auch als Lightweight-Prozess bezeichnet.
- Übergeordnete Prozessdaten und Code werden von den Threads gemeinsam genutzt.
- Die Kommunikation zwischen Threads ist im Vergleich zur Kommunikation in einem Prozess einfach.
- Threads in Java können durch die Implementierung von java.lang erstellt werden. Lauffähige Schnittstelle.
Einzelner Thread
In einem Programm sind mehrere Verarbeitungseinheiten vorhanden, von denen die kleinste als Single Thread bezeichnet wird. Durch die Verwendung der „Thread-Klasse“ wendet Java die Threads an. Es gibt zwei Arten von Threads; der Daemon-Thread und der Benutzer-Thread.
Wenn die Anwendung bereinigt werden soll, erfolgt die Verwendung von Daemon-Threads. Es läuft im Hintergrund einer Anwendung. Während die Benutzer-Threads erstellt werden, wenn die Anwendung zum ersten Mal gestartet wird.
Vorteile des Single-Threads:
- Der Anwendungsaufwand wird reduziert, da die Ausführung eines einzelnen Threads in einem System erfolgt.
- Die Wartungskosten der Anwendung werden durch die Verwendung einzelner Threads reduziert.
Multitasking in Java
Multitasking bezieht sich auf den Prozess der gleichzeitigen Ausführung mehrerer Aufgaben durch die CPU. Manchmal kann ein CPU-Umschalten zwischen Aufgaben durch den Benutzer ausgeführt werden, um mit jedem Programm gemeinsam zusammenzuarbeiten. Beim Multitasking werden den Prozessen separate Speicher und Ressourcen zugewiesen. Multitasking kann auf zwei Arten erreicht werden.
1. Multiprocessing (prozessbasiertes Multitasking)
- Jedem Prozess wird ein separater Speicherbereich zugewiesen. Daher gibt es für jeden Prozess eine Adresse im Speicher.
- Die Prozesse sind schwergewichtig.
- Es gibt einen hohen Kommunikationsaufwand zwischen Prozessen.
- Das Umschalten zwischen den Prozessen erfordert einige Zeit. Dies wird zum Aktualisieren von Listen, Speicherkarten usw. benötigt.
2. Multithreading (threadbasiertes Multitasking)
- Dieselbe Adresse wird von den Threads geteilt.
- Fäden sind leicht.
- Es gibt einen niedrigen Kommunikationsaufwand zwischen den Threads.
Was ist Multithreading?
Wenn zwei oder mehr Threads gleichzeitig in einem Programm ausgeführt werden, wird dieser Mechanismus als Multithreading bezeichnet. Ein einzelner Prozess erzeugt viele Threads, wodurch die Rechenleistung erhöht wird. Zwei oder mehr Teile eines Programms werden so ausgeführt, dass die CPU maximal ausgelastet wird.
Als Threads werden die einzelnen Teile des Programms bezeichnet. Die Prozesse in einer Anwendung können entweder mehrere Threads oder einzelne Threads enthalten.
Mehrere Threads einer Anwendung werden von der Java Virtual Machine zugelassen. Jeder Thread hat seine eigene Priorität. Daher werden Threads mit höherer Priorität bevorzugt ausgeführt als solche mit niedrigerer Priorität.
Um Multitasking zu erreichen, wird sowohl der Prozess des Multithreading als auch des Multiprocessing verwendet. Da beim Multithreading ein gemeinsam genutzter Speicherbereich verwendet wird, wird er meistens über Multiprocessing verwendet. Speicher wird eingespart, da keine zusätzliche Speicherzuweisung erforderlich ist. Außerdem ist die benötigte Zeit geringer als bei der Mehrfachverarbeitung, da ein Kontextwechsel zwischen Threads stattfindet.
In Animationen und Spielen wird Java-Multithreading verwendet. Klicken Sie hier, wenn Sie mehr über Java-Architektur und -Komponenten erfahren möchten.
Zwei Mechanismen können zum Erstellen von Threads verwendet werden.
1. Thread-Klassenerweiterung
2. Lauffähige Schnittstellenimplementierung
Thread-Klasse vs. ausführbare Schnittstelle
- Das Erweitern der „Thread-Klasse“ kann andere Klassen nicht erweitern, da Mehrfachvererbung in Java nicht unterstützt wird. Aber mit der Implementierung des Interfaces „Runnable“ können andere Basisklassen aus der Klasse erweitert werden.
- Die grundlegende Funktionalität eines Threads kann durch Erweitern der Thread-Klasse erweitert werden, da eingebaute Methoden wie interrupt(), yield() usw. bereitgestellt werden.
- Wenn Runnable verwendet wird, wird ein Objekt bereitgestellt, das von mehreren Threads gemeinsam genutzt werden kann.
Java-Thread-Klasse
Die Thread-Programmierung in Java wird durch die Thread-Klasse erreicht. Konstruktoren werden von der Thread-Klasse und Methoden zum Ausführen von Thread-Operationen bereitgestellt. Eine Thread-Klasse implementiert eine lauffähige Schnittstelle und erweitert die Object-Klasse.
Einige häufig verwendete Thread-Methoden sind:
- start(): Die Thread-Ausführung wird durch diese Methode gestartet. Die Methode run() wird von der JVM aufgerufen.
- sleep(int milliseconds): Die Ausführung des Threads wird für Millisekunden angehalten, die bereitgestellt werden, wenn der Threading-Prozess durch diese Methode in den Ruhezustand versetzt wird. Nach der Pause beginnt die Ausführung des Threads erneut. Threads können durch diese Methode synchronisiert werden.
- getName(): Der Threadname wird durch diese Methode zurückgegeben.
- setPriority(int neue Priorität): Die Thread-Priorität wird durch diese Methode geändert.
- yield(): Der aktuelle Thread wird durch diese Methode mit der Ausführung der anderen Threads angehalten.
- run(): Die Methode dient zum Starten einer Aktion im Thread.
- getPriority(): Die Thread-Priorität wird durch die Verwendung dieser Methode zurückgegeben.
- setName(): Der Threadname wird durch diese Methode geändert.
- getId(): Die Thread-ID wird durch diese Methode zurückgegeben.
- suspend(): Der Thread wird durch diese Methode ausgesetzt.
Thread-Lebenszyklus
Der Thread-Lebenszyklus hat verschiedene Phasen, die im Folgenden aufgeführt sind:
- Neu: „Thread-Klasse“ wird in dieser Phase zum Erstellen eines Threads verwendet. Bis der Thread gestartet wird, bleibt das Programm in dieser Phase. Die Methode wird auch als Born Thread bezeichnet.
- Ausführbar: Die start-Methode ruft die Thread-Instanz in dieser Phase des Thread-Lebenszyklus auf. Dem Scheduler wird die Steuerung des Threads zum Beenden der Ausführung übergeben. Ob der Thread ausgeführt werden soll oder nicht, hängt vom Scheduler ab.
- Running: Sobald die Ausführung des Threads gestartet wurde, wird die Phase in die Phase „Running“ verschoben. Ein Thread wird vom Scheduler aus dem Pool von Threads ausgewählt und startet die Ausführung der Anwendung.
- Waiting : Wie der Name schon sagt, wartet der Thread in dieser Phase des Lebenszyklus. Die Threadsynchronisierung ist aufgrund der Ausführung mehrerer Threads in einer Anwendung unerlässlich. Daher muss ein Thread warten, bis die Ausführung des anderen Threads abgeschlossen ist. Daher wird die Phase des Lebenszyklus auch als Wartephase bezeichnet.
- Tot: Die Phase, in der der Thread beendet wird, wird als „tote“ Phase bezeichnet. Sobald der Thread von der Ausführung zum Ende der Verarbeitung übertragen wird, wird er beendet und befindet sich daher im „toten Zustand“.
Thread-Synchronisation in Java
Beim Multithreading tritt in einem Programm asynchrones Verhalten auf. Wenn vermeintlich Daten durch einen Thread geschrieben werden und das Lesen der Daten gleichzeitig von einem anderen Thread durchgeführt wird, kann es zu Inkonsistenzen in der Anwendung kommen.
Auf die von Threads gemeinsam genutzten Ressourcen muss von anderen Threads zugegriffen werden. Daher wird in solchen Fällen der Ansatz der Synchronisation angegangen. Synchronisierte Methoden sind in Java verfügbar, um ein Synchronisationsverhalten zu erreichen.
Wenn ein Thread den synchronisierten Block erreicht, kann die Methode nach dem Erreichen nicht mehr von anderen Threads für dasselbe Objekt aufgerufen werden. Bis der Thread die Ausführung des Blocks beendet und ihn verlässt, müssen die anderen Threads anhalten und warten.
Lernen Sie Softwarekurse online von den besten Universitäten der Welt. Verdienen Sie Executive PG-Programme, Advanced Certificate-Programme oder Master-Programme, um Ihre Karriere zu beschleunigen.
Vorteile von Multithreading
- Mehrere Operationen können gleichzeitig durchgeführt werden. Wenn die unabhängigen Threads laufen, wird der Benutzer nicht blockiert.
- Zeit wird gespart, da mehrere Operationen zusammen ausgeführt werden.
- Ein Thread kann nicht von einem anderen Thread beeinflusst werden, da sie unabhängig sind. Das Auftreten einer Ausnahme in einem Thread wirkt sich nicht auf die Ausführung anderer Threads aus.
Beispiel für Multithreading
Ein Beispiel für ein Multithreading-Programm in Java wurde unten gezeigt:
Quelle
Abbildung 1: Ein Ausschnitt des Multithreading-Codebeispiels
Die Code-Erklärung
Zeile 3: Die Klasse „GuruThread1“ implementiert Runnable.
Zeile 8: Zeigt die Hauptmethode der Klasse an.
Zeile 9: Die Thread-Klasse wird instanziiert und eine Instanz „guruThread1″ wird erstellt und ein Thread wird erstellt.
Zeile 10: Die „Thread-Klasse“ wird instanziiert und eine Instanz „guruThread2“ und ein Thread werden erstellt.
Zeile 11: Der Thread namens guruThread1 wird gestartet.
Zeile 12: Der Thread namens guruThread2 wird gestartet.
Zeile 13: Der Text „Thread names are following:“ wird ausgegeben.
Zeile 14: Die Methode getName() wird verwendet, um den Thread1-Namen zu erhalten.
Zeile 15: Die Methode getName() wird verwendet, um den Thread2-Namen zu erhalten.
Die Ausführung des obigen Codes führt zu folgender Ausgabe:
Quelle
Abbildung: Ein Screenshot der vom Multithreading-Programm in Java generierten Ausgabe (entnommen aus
Fazit
Der Artikel diskutierte das Konzept des Multithreading in Java zusammen mit einem Beispiel eines Multithreading-Programms in Java. Ihr Lernen hört hier nicht auf und kommt mit all den anderen grundlegenden Konzepten von Java zurecht.
Wenn Sie daran interessiert sind, Ihre Programmierkenntnisse zu einem günstigen Preis zu beherrschen und sich industrietauglich zu machen, können Sie das Studienangebot von upGrad „Master of Science in Informatik“ prüfen. Es richtet sich an alle Berufstätigen der mittleren Ebene in der Altersgruppe von 21 bis 45 Jahren. Der Kurs ist von der Liverpool John Moores University zertifiziert und mit mehr als 500 Lernstunden, 309 Projekten und Aufgaben konzipiert, um das Beste aus Ihnen herauszuholen. Wenn Sie Fragen haben, schreiben Sie uns eine Nachricht, unser Team wird sich mit Ihnen in Verbindung setzen.