Wenn wir eine Anwendung in der realen Welt ausführen, verwenden wir leistungsfähige Prozessoren für eine schnellere Ausführung. Aber nur die Prozessorgeschwindigkeit allein kann Ihre Anwendung nicht schnell ausführen. Eine großartige Möglichkeit, eine leistungseffiziente Anwendung zu erstellen, ist die Verwendung von Multithreading.
Was ist Multithreading?
Multithreading ist ein Programmierkonzept, bei dem die Anwendung eine kleine Einheit von Aufgaben erstellen kann, die parallel ausgeführt werden sollen. Wenn Sie an einem Computer arbeiten, werden mehrere Anwendungen ausgeführt, und die Rechenleistung wird auf sie verteilt. Ein einfaches Programm läuft sequenziell ab, und die Codeanweisungen werden nacheinander ausgeführt. Dies ist eine single-threaded Anwendung. Aber wenn die Programmiersprache das Erstellen mehrerer Threads unterstützt und sie dem Betriebssystem übergibt, um parallel ausgeführt zu werden, spricht man von Multithreading.
Multithreading vs. Multiprocessing
Wenn wir über Multithreading sprechen, spielt es keine Rolle, ob die Maschine einen 2-Kern-Prozessor oder einen 16-Kern-Prozessor hat. Unsere Aufgabe besteht darin, eine multithreaded Anwendung zu erstellen und das Betriebssystem die Zuweisung und Ausführung zu überlassen. Kurz gesagt hat Multithreading nichts mit Multiprocessing zu tun.
Wie unterstützt Java Multithreading?
Java bietet eine ausgezeichnete Unterstützung für multithreaded Anwendungen. Java unterstützt Multithreading durch die Thread-Klasse. Der Java-Thread ermöglicht es uns, einen leichtgewichtigen Prozess zu erstellen, der einige Aufgaben ausführt. Wir können mehrere Threads in unserem Programm erstellen und starten. Die Java Laufzeitumgebung kümmert sich um die Erstellung von maschinennahen Anweisungen und arbeitet mit dem Betriebssystem zusammen, um sie parallel auszuführen.
Welche Arten von Threads gibt es?
Es gibt zwei Arten von Threads in einer Anwendung – Benutzer-Thread und Daemon-Thread. Wenn wir eine Anwendung starten, ist der main der erste Benutzer-Thread, der erstellt wird. Wir können sowohl Benutzer-Threads als auch Daemon-Threads erstellen. Wenn alle Benutzer-Threads ausgeführt wurden, beendet die JVM das Programm.
Was ist Thread-Priorität?
Wenn wir einen Thread erstellen, können wir ihm eine Priorität zuweisen. Wir können verschiedenen Threads unterschiedliche Prioritäten zuweisen, aber dies garantiert nicht, dass ein Thread mit höherer Priorität vor einem Thread mit niedrigerer Priorität ausgeführt wird. Der Thread-Scheduler ist Teil der Betriebssystemimplementierung, und wenn ein Thread gestartet wird, wird seine Ausführung vom Thread-Scheduler gesteuert, und die JVM hat keine Kontrolle über seine Ausführung.
Wie erstellen wir einen Thread in Java?
Threads können erstellt werden, indem wir entweder das Runnable-Interface implementieren oder die Thread-Klasse erweitern.
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
Hier sehen Sie eine Einzeiler-Anweisung zur Erstellung eines neuen Threads. Hier erstellen wir ein Runnable als anonyme Klasse. Wenn Sie mit Lambda-Ausdrücken vertraut sind, können wir einen Thread mit wesentlich kürzerem Code erstellen.
Runnable runnable = () -> System.out.println("Hello");
Nachdem wir einen Thread erstellt haben, müssen wir seine Ausführung durch Aufrufen der Methode start() starten.
runnable.start();
I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.
1. Java Thread und Runnable
Dies ist der erste Beitrag über die Thread-Klasse und das Runnable-Interface. Sie werden auch etwas über Prozesse und Threads erfahren. Was ist der Unterschied zwischen Thread und Prozess? Vorteile der Verwendung von Threads und wie wir Threads mithilfe des Runnable-Interfaces und der Thread-Klasse erstellen können. Dieser Beitrag vergleicht auch das Runnable-Interface mit der Thread-Klasse.
2. Java Thread Sleep
Java Thread sleep wird verwendet, um die Ausführung des aktuellen Threads anzuhalten. Wir werden Thread-Sleep in zukünftigen Beiträgen ausgiebig verwenden, daher ist es gut zu wissen, wie es funktioniert und ob es genau ist oder nicht.
3. Java Thread Join
Manchmal müssen wir auf andere Threads warten, bevor wir mit der Ausführung fortfahren können. Dies können wir mithilfe der Thread-Join-Methode erreichen. Erfahren Sie, wie es funktioniert und wann wir es verwenden sollten.
4. Java Thread-Zustände
Das Verständnis der verschiedenen Thread-Zustände ist wichtig. Erfahren Sie, wie sich ein Thread seinen Zustand ändert und wie der Betriebssystem-Threadplaner den Zustand eines Threads ändert.
5. Java Thread warten, benachrichtigen und alle benachrichtigen
Die Java Object-Klasse enthält drei Methoden, um den Sperrstatus einer Ressource zu kommunizieren. Lernen Sie anhand eines einfachen Wait-Notify-Beispiels die Verwendung dieser Object-Klassenmethoden.
6. Thread-Sicherheit und Synchronisation
Wir wissen, dass Threads Objektressourcen teilen, was zu Datenkorruption führen kann, da diese Operationen nicht atomar sind. Erfahren Sie, wie wir Thread-Sicherheit in Java mit verschiedenen Methoden erreichen können. Lesen Sie diesen Beitrag, um mehr über die korrekte Verwendung von Synchronisation, synchronisierten Methoden und synchronisierten Blöcken zu erfahren.
7. Java-Ausnahme im Hauptthread
Die JVM erstellt den ersten Thread mit der Methode „main“. Dieser Beitrag erklärt einige gängige Ausnahmen, die wir im täglichen Leben sehen, deren Ursache und wie man sie behebt.
8. Thread-Sicherheit in Singleton-Klasse
In diesem Artikel erfahren Sie die grundlegenden Konzepte zur Erstellung einer Singleton-Klasse. Welche Thread-Sicherheitsprobleme treten bei verschiedenen Implementierungen auf? Wie erreichen wir Thread-Sicherheit in einer Singleton-Klasse.
9. Dämonenthread in Java
A simple article explaining daemon threads and how we can create daemon threads in java.
10. Java Thread Local
Wir wissen, dass Threads die Objektvariablen teilen, aber was ist, wenn wir threadlokale Variablen auf Klassenebene haben möchten? Java bietet die Klasse `ThreadLocal` als Hilfsklasse, um threadlokale Variablen zu erstellen. Lesen Sie weiter, um mehr darüber zu erfahren, wie wir `ThreadLocal`-Variablen im Java-Programm erstellen können.
11. Java Thread Dump
Der Java Thread Dump gibt Informationen über den aktuellen Thread wieder. Ein Thread-Dump ist nützlich zur Analyse von Leistungsproblemen in der Anwendung. Sie können Thread-Dumps verwenden, um Deadlock-Situationen zu finden und zu beheben. Dieser Beitrag erklärt verschiedene Methoden, die in Java verwendet werden können, um Thread-Dumps zu generieren.
12. Wie man Deadlocks in Java analysiert
Deadlock ist eine Situation, in der mehrere Threads darauf warten, dass sich gegenseitig freigegebene Ressourcen freigeben, was zu einer zyklischen Abhängigkeit führt. Dieser Artikel diskutiert die Situation, in der wir in einem Java-Programm einen Deadlock erhalten können. Wie wir Thread-Dumps verwenden können, um den Deadlock zu finden, und bewährte Verfahren, um Deadlocks in Java-Programmen zu vermeiden.
13. Java-Timer-Thread
Dieser Beitrag erklärt, wie wir die Klassen Java Timer und TimerTask verwenden können, um Aufgaben in einem festgelegten Intervall auszuführen, ein Beispielprogramm, das seine Verwendung zeigt, und wie wir den Timer abbrechen können.
14. Java-Produzenten-Verbraucher-Problem
Vor Java 5 konnte das Produzenten-Verbraucher-Problem mithilfe der Methoden wait() und notify() gelöst werden, aber die Einführung von BlockingQueue hat es sehr einfach gemacht. Erfahren Sie, wie wir BlockingQueue verwenden können, um das Produzenten-Verbraucher-Problem in Java zu lösen.
15. Java Thread Pool
Java Thread Pool ist eine Sammlung von Arbeits-Threads, die darauf warten, Aufgaben zu verarbeiten. Die Einführung des Executor-Frameworks in Java 5 hat es sehr einfach gemacht, einen Thread-Pool in Java zu erstellen. Wir können die Klassen Executors und ThreadPoolExecutor verwenden, um einen Thread-Pool zu erstellen und zu verwalten.
16. Java Callable Future
Manchmal möchten wir, dass unser Thread einige Werte zurückgibt, die wir verwenden können. Java 5 Callable kann in diesem Fall verwendet werden, was dem Runnable-Interface ähnelt. Wir können das Executor-Framework verwenden, um Callable-Aufgaben auszuführen.
17. Java FutureTask Beispiel
Die FutureTask-Klasse ist die Basisklasse, die das Future-Interface implementiert. Wir verwenden sie mit einer Callable-Implementierung und Executors für die asynchrone Verarbeitung. Die FutureTask-Klasse bietet Implementierungsmethoden, um den Zustand der Aufgabe zu überprüfen und den Wert an das aufrufende Programm zurückzugeben, sobald ihre Verarbeitung abgeschlossen ist. Es ist praktisch, wenn Sie einige der Implementierungsmethoden des Future-Interfaces überschreiben möchten.
Abschluss
Multithreading ist ein sehr breites Thema, und alles darüber in einem einzelnen Beitrag zu schreiben, wäre nicht möglich gewesen. Wenn Sie die obigen Beiträge in der Reihenfolge durchgehen, lernen Sie alles über Multithreading in Java.
Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java