JavaRush /Java-Blog /Random-DE /Multithreading in Java

Multithreading in Java

Veröffentlicht in der Gruppe Random-DE

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.
Multithreading in Java - 1
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 .
Multithreading in Java - 2
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.
Multithreading in Java - 3
Oder nach einem anderen Prinzip: Da es in der unteren Gruppe mehr Leute gibt, wechseln wir zwei Mädchen für einen Jungen ab.
Multithreading in Java - 4
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 Streamusw. 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 mainund 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- daemonThreads 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, Threadin 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    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны dokumentierenы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } 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 queue1wiederum queue2Nachrichten ü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.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION