„Hallo Amigo! Wir kommen zu einem neuen und sehr schwierigen Thema. Es tut mir leid. Es wird oft als eines der komplexesten Themen nicht nur in Java, sondern auch in der Programmierung allgemein angesehen. Ich spreche von Multithreading.“
Stell dir ein typisches Computerspiel vor, zum Beispiel ein Rennspiel mit Raumschiffen. Du fliegst durch die Weiten des Kosmos, weichst Meteoriten und Patrouillenkreuzern aus. Zwei Dutzend weitere Spieler nehmen mit dir an diesen illegalen Rennen teil.
Gehen wir also davon aus, du willst ein solches Spiel schreiben. Dein Programm muss die Befehle (Tastatureingaben) verfolgen, die Raumschiffe bewegen, ihre Flugbahnen berechnen, die Folgen eventueller Kollisionen ermitteln und all dies auf den Bildschirm des Benutzers zeichnen. Das ist eine sehr komplexe Aufgabe.
Erinnerst du dich, wie wir das „Problem der großen Komplexität“ im Beispiel des wachsenden Versandunternehmens gelöst haben?
Wir haben es in unabhängige Abteilungen aufgeteilt und deren Interaktionen streng angegeben (standardisiert).
„Aber was machen wir, wenn die unabhängigen Teile parallel zu den anderen Teilen arbeiten müssen?! Die Lösung lautet: Threads."
Stell dir ein Programm als einen kleinen Roboter vor, der im Code herumläuft und Befehle ausführt. Zuerst führt er einen Befehl in einer Zeile aus, dann geht es zur nächsten Zeile und so weiter.
„Das kann ich mir problemlos vorstellen. Ein Kinderspiel!“
„Sehr schön. Und nun stell dir vor, du hast mehrere dieser Roboter. Während der eine die Benutzereingaben bearbeitet, aktualisiert der zweite die Objekte auf der Grundlage dieser Eingaben. Ein dritter führt den Code zum Anzeigen dieser Objekte auf dem Bildschirm aus. Ein vierter prüft mehrmals pro Sekunde, ob irgendwelche Raumschiffe kollidiert sind und berechnet gegebenenfalls die Ergebnisse der Kollision.“
So können wir das Programm nicht nur in unabhängige Teile/Objekte aufteilen, sondern auch so gestalten, dass diese Teile unabhängig voneinander ihre Arbeit verrichten können. Je weniger Interaktion zwischen den einzelnen Teilen besteht, desto weniger komplex ist das Programm.
Stell dir vor, du könntest den Manager durch ein Skript ersetzen, das Briefe versendet. Und die anderen Abteilungen des Unternehmens könnten nicht einmal erkennen, dass es eine Veränderung gegeben hätte. So etwas geschah bereits im 26. Jahrhundert mit hervorragenden Ergebnissen. Die meisten Manager und sogar Spitzen-Führungskräfte können erfolgreich durch ein Skript durchschnittlicher Komplexität ersetzt werden. Erst nach dem Eingreifen der „Büroplankton-Gewerkschaft“ wurden die Massenentlassungen von Managern beendet. Aber ich schweife ab.
„Sehr interessant!“
„Es kann nicht nur mehrere dieser ‚kleinen Roboter‘ geben, die Code ausführen, sie können außerdem auch miteinander kommunizieren und neue Roboter hervorbringen.“
„Neue Roboter hervorbringen?“
„Ja, um neue Aufgaben zu erfüllen. Manchmal ist es vorteilhaft, einen weiteren Roboter (einen weiteren Thread) zu erstellen, um eine Aktion zur gleichen Zeit wie der aktuelle Thread (Roboter) durchzuführen.“
„Das hört sich gut an, aber ich weiß nicht, wo ich das einsetzen sollte.“
Und warum nennen wir sie ‚Threads‘?
„Stell dir vor, jeder Roboter hat eine andere Farbe und markiert Befehle mit seiner Farbe, während er sie ausführt. Der Pfad, den der kleine Roboter nimmt, ist wie die Linie, die ein Bleistift hinterlässt. Dieser Pfad zieht sich hinter dem Roboter her, wie ein Faden (engl. Thread) hinter einer Nadel.“
Jeder ‚kleine Roboter‘ hat eine Aufgabe, für die er geschaffen wurde. Du kannst dir einen Thread als Menge der Befehle vorstellen, die während der Ausführung dieser Aufgabe ausgeführt werden.
Nehmen wir an, du fliegst mit einem Raumschiff, um Fracht auszuliefern. Dann ist ‚Fracht ausliefern‘ deine Aufgabe, und du befindest dich mitten in der Ausführung. Und deine Flugbahn ist dein Thread. Wir könnten sagen, dass jede neue Aufgabe, jede noch nicht abgeschlossene Aufgabe, einen eigenen Thread hat (einen Pfad, der noch durchlaufen werden muss).
„Mit anderen Worten: Es gibt eine Aufgabe und einen ‚kleinen Roboter‘, der sie ausführt. Und ein Faden ist nur der Pfad, den der Roboter nimmt, während er seine Aufgabe erfüllt?“
„Exakt.“
So funktioniert das alles tief im Inneren. Da der Computer nur einen Prozessor hat, kann er immer nur einen Befehl zur gleichen Zeit ausführen. Deshalb geschieht Folgendes: Der Prozessor wechselt ständig zwischen den Threads. Er wechselt zu einem neuen Thread, führt einige Befehle aus, wechselt dann zum nächsten Thread, führt einige Befehle aus und immer so weiter. Da das Umschalten zwischen den Threads jedoch hunderte Male pro Sekunde erfolgt, scheint es uns, als würden alle Threads gleichzeitig ausgeführt werden.
![Multithreading - 1](https://cdn.codegym.cc/images/article/73cd26b8-2e11-4139-bef2-04f3943673fd/original.jpeg)