Einführung
Bevor wir uns mit Java-Threads befassen, werfen wir einen Blick in die nahe Zukunft. Stellen Sie sich vor, Sie haben Ihren Lebenslauf eingereicht und ein Vorstellungsgespräch geführt. Sie und ein paar Dutzend zukünftige Kollegen wurden eingeladen, bei einem großen Softwareunternehmen zu arbeiten. Unter anderem müssen Sie einem müden HR-Mitarbeiter Papierdokumente für die Anstellung vorlegen.
Um den Prozess zu beschleunigen, können Bewerber für die Stelle in zwei Gruppen eingeteilt und auf zwei Personalverantwortliche (sofern im Unternehmen vorhanden) verteilt werden. Dadurch beschleunigen wir den Prozess durch parallele
Designarbeiten .
Wenn es im Unternehmen nur einen Personalreferenten gibt, muss man irgendwie raus. Sie können zum Beispiel wieder alle in zwei Gruppen aufteilen und beispielsweise abwechselnd Mädchen und Jungen interviewen.
Oder nach einem anderen Prinzip: Da es in der unteren Gruppe mehr Leute gibt, wechseln wir zwei Mädchen für einen Jungen ab.
Diese Art der Arbeitsorganisation wird
Multithreaded genannt . Unser müder Personaler wechselt in verschiedene Gruppen, um dort den nächsten Mitarbeiter zu rekrutieren. Es gibt vielleicht elf Gruppen und vier Personalverantwortliche. In diesem Fall erfolgt die Multithreading-
Verarbeitung parallel durch mehrere HRs, die aus einer beliebigen Gruppe die nächste Person mit der Bearbeitung ihrer Dokumente beauftragen können.
Prozesse
Der Prozess (
Prozess ) ist in diesem Fall die Organisation der Dokumentenannahme. In einer Organisation können mehrere Prozesse unterschieden werden: Buchhaltung, Softwareentwicklung, Besprechungen mit Kunden, Lagerbetrieb usw. Für jeden Prozess werden Ressourcen zugewiesen: Räumlichkeiten, Mitarbeiter für seine Ausführung. Die Prozesse sind voneinander isoliert: Personalverantwortliche haben keinen Zugriff auf die Buchhaltungsdatenbank und Kundendienstmanager laufen nicht im Lager herum. Wenn ein Prozess Zugriff auf die Ressourcen einer anderen Person erhalten muss, ist es notwendig, eine prozessübergreifende Kommunikation einzurichten: Memos, gemeinsame Besprechungen.
Streams
Die Arbeit in einem Prozess ist in Threads (
java thread
) organisiert. Für die Personalabteilung ist Flow die Organisation der Arbeit, um einer Gruppe zu dienen. Im allerersten Bild ist ein Fluss zu sehen, in den nächsten drei sind es zwei. Innerhalb des Prozesses können Threads parallel ausgeführt werden – zwei Personalverantwortliche nehmen zwei oder mehr Gruppen zukünftiger Mitarbeiter auf. Die Interaktion von Personalverantwortlichen mit Gruppen – die Abarbeitung von Threads innerhalb eines Prozesses – wird als
Thread-Synchronisation bezeichnet . Die Zeichnungen der Gestaltung zweier Gruppen durch einen Personalreferenten zeigen Methoden: einheitlich (Mädchen – Junge – Mädchen – Junge) und mit unterschiedlichen Prioritäten (zwei Mädchen wechseln sich mit einem Jungen ab). Threads haben Zugriff auf die Ressourcen des Prozesses, zu dem sie gehören: Gruppen des Personalverantwortlichen erhalten Muster von Bewerbungsformularen, Stifte zum Ausfüllen von Dokumenten. Wenn Flüsse jedoch mit Dingen interagieren, die ihnen gemeinsam sind, sind Vorfälle möglich. Wenn der Personalreferent Sie auffordert, den Namen der letzten Person in der Warteschlange zu rufen, ist er sich bei zwei Gruppen im Voraus nicht sicher, ob er den Namen einer Frau oder eines Mannes hören wird. Solche Datenzugriffskonflikte, Sperrungen und Möglichkeiten zu deren Lösung sind ein sehr wichtiges Thema.
Strömungszustände
Jeder Thread befindet sich in einem der folgenden Zustände:
- Erstellt (
New
) – die Leitung für den Personalverantwortlichen wird vorbereitet, die Leute werden organisiert.
- Gestartet (
Runnable
) – unsere Warteschlange steht vor dem Personalverantwortlichen und wird bearbeitet.
- Blockiert (
Blocked
) – der letzte Mann in der Warteschlange versucht, einen Namen zu rufen, aber als er hörte, dass das Mädchen in der nächsten Gruppe vor ihm damit begann, verstummte er.
- Abgeschlossen (
Terminated
) – die gesamte Warteschlange wurde vom Personalverantwortlichen abgeschlossen und es besteht keine Notwendigkeit dafür.
- Waiting(
Waiting
) – eine Warteschlange wartet auf ein Signal von einer anderen.
Die Organisation von Threads und deren Interaktion ist die Grundlage für den effektiven Ablauf von Prozessen.
Kehren wir zurück in die IT-Welt
Im 21. Jahrhundert ist die Multithread- und Parallelausführung relevant geworden. Seit den 90er Jahren des letzten Jahrhunderts haben sich die Multitasking-Betriebssysteme Windows, MacOS und Linux auf Heimcomputern fest etabliert. Oft finden sich darin vier oder mehr Kernprozessoren. Die Anzahl der parallelen Blöcke von GPU-Grafikkarten hat bereits tausend überschritten. Beliebte Programme werden unter Berücksichtigung von Multithreading (Multithreading) geschrieben, zum Beispiel moderne Versionen von Software zur Verarbeitung von Grafiken, Videos oder zum Betrieb mit großen Datenmengen: Adobe Photoshop, WinRar, Mathematica, moderne Spiele. Java-Multithreading ist ein sehr wichtiges, beliebtes und komplexes Thema. Daher gibt es im JavaRush-Kurs viele Aufgaben, um es sehr gut zu verstehen. Java-Beispiele zum Multithreading helfen Ihnen, die grundlegenden Nuancen und Feinheiten dieses Bereichs zu beherrschen und die Arbeit von Threads zu synchronisieren.
Verfahren
Ein Prozess ist eine laufende Instanz eines Programms, dem das Betriebssystem (OS) Speicher, Prozessorzeit/-kerne und andere Ressourcen zugewiesen hat. Es ist wichtig, dass der Speicher separat zugewiesen wird; die Adressräume verschiedener Prozesse sind füreinander nicht zugänglich. Wenn Prozesse kommunizieren müssen, können sie dies über Dateien, Pipes und andere Kommunikationsmethoden zwischen Prozessen tun.
Fließen
Java
Thread
(Stream). Um Verwechslungen mit anderen Java-Klassen
Stream
usw. zu vermeiden, werden Java-Threads manchmal als Thread übersetzt. Sie nutzen die einem Prozess zugewiesenen Ressourcen und bestimmen die Art und Weise, wie der Prozess ausgeführt wird. Der Hauptthread führt die Methode aus
main
und wird beendet. Wenn ein Prozess ausgeführt wird, können zusätzliche Threads (untergeordnete Threads) erzeugt werden. Threads desselben Prozesses können Daten untereinander austauschen. Java-Multithreading erfordert die Berücksichtigung der Datensynchronisierung. Vergessen Sie dies nicht. In Java endet ein Prozess, wenn sein letzter Thread beendet ist. Für Hintergrundaufgaben kann ein Thread als Daemon (
daemon
) gestartet werden. Der Unterschied zu einem regulären Thread besteht darin, dass er zwangsweise beendet wird, wenn alle Nicht-
daemon
Threads des Prozesses beendet werden.
Erste Multithread-Anwendung
Es gibt mehr als ein halbes Dutzend Möglichkeiten, Threads zu erstellen; im JavaRush-Kurs werden wir sie im Detail untersuchen. Machen wir uns zunächst mit einem der Grundprinzipien vertraut. Es gibt eine spezielle Klasse,
Thread
in deren Methode
run()
Sie Code schreiben müssen, der die Logik des Programms implementiert. Nachdem Sie einen Thread erstellt haben, können Sie ihn durch Aufrufen von starten
start()
. Schreiben wir ein Demoprogramm, das ein Beispiel für Java-Multithreading implementiert.
class PeopleQueue extends Thread {
private String[] names;
PeopleQueue(String... names) {
this.names = names;
}
@Override
public void run() {
for (int i = 0; i < names.length; i++) {
System.out.println("Обработаны dokumentierenы: " + names[i]);
try {
sleep(500);
} catch (Exception e) {}
}
}
}
public class HR {
public static void main(String[] args) {
PeopleQueue queue1 = new PeopleQueue("Iwan","Сергей","Николай","Фердинанд","Basilikum");
PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина",„Olga“);
System.out.println("Начали!");
queue1.start();
queue2.start();
}
}
Lassen Sie uns das Programm starten. Die Konsole zeigt die Nachrichtenausgabe des Hauptthreads an. Als nächstes gibt jeder untergeordnete Thread
queue1
wiederum
queue2
Nachrichten über den nächsten verarbeiteten Mitarbeiter an seine gemeinsame Konsole aus. Eine der möglichen Optionen für das Programm:
Начали!
Обработаны dokumentierenы: Мария
Обработаны dokumentierenы: Iwan
Обработаны dokumentierenы: Людмила
Обработаны dokumentierenы: Сергей
Обработаны dokumentierenы: Алиса
Обработаны dokumentierenы: Николай
Обработаны dokumentierenы: Карина
Обработаны dokumentierenы: Фердинанд
Обработаны dokumentierenы: Ольга
Обработаны dokumentierenы: Васoderй
Process finished with exit code 0
Multithreading in Java ist ein komplexes und vielschichtiges Thema. Die Fähigkeit, Code mithilfe von Parallel-, Multitasking- und Multithread-Computing zu schreiben, hilft Ihnen dabei, Aufgaben auf modernen Multi-Core-Prozessoren und Clustern, die aus vielen Computern bestehen, effektiv umzusetzen.
GO TO FULL VERSION