Kursinhalt
Multithreading in Java
Multithreading in Java
Produzent-Konsument
Großartige Arbeit! Sie haben einen langen Weg zurückgelegt, und wir haben viele theoretische und praktische Beispiele erkundet!
Möglicherweise sind Sie dem Producer-Consumer
-Muster in anderen Abschnitten begegnet, aber Sie haben es vielleicht nicht bemerkt. In diesem Abschnitt werden wir es im Detail besprechen, und wenn etwas aus den vorherigen Beispielen unklar war, wird es in diesem Abschnitt klar werden!
Das Producer-Consumer
Muster umfasst zwei Arten von Threads, die aus dem Namen klar hervorgehen: Producer und Consumer.
Der Producer
wird einige Daten erzeugen, die er in einen gemeinsamen Puffer/Warteschlange einfügt, auf den auch der Consumer
Zugriff hat, und er wird diese Daten einfach aus dem Datenspeicherort konsumieren.
Hinweis
Das Hauptziel des Musters ist es, die Produktion und den Verbrauch von Daten zu trennen, sodass Produzenten unabhängig von Konsumenten arbeiten können.
Wo es verwendet wird
Dieses Muster wird häufig in Systemen eingesetzt, in denen eine asynchrone Datenverarbeitung erforderlich ist. Wir werden später im Detail erforschen, was asynchrony
bedeutet.
In der Praxis wird dieses Muster häufig für Ereignisverarbeitungssysteme, Datenprotokollierung, Netzwerkanforderungsbearbeitung und parallele Datenverarbeitung verwendet.
Stellen Sie sich ein Fließband in einer Fabrik vor, bei dem ein Arbeiter Teile auf das Fließband legt (Produzent) und ein anderer Arbeiter sie entfernt und zu einem Produkt zusammenbaut (Konsument). Der Produzent und der Konsument könnten mit unterschiedlichen Geschwindigkeiten arbeiten, aber das Fließband (Puffer) hilft ihnen, synchron zu bleiben.
Wie sieht es im Code aus?
Betrachten wir ein Beispiel für die Verwendung von BlockingQueue
, um das Producer-Consumer
-Muster zu implementieren.
Hinweis
Sie können zwischen den Tabs wechseln, und so greifen Sie auf den Code zu, den Sie benötigen.
ExampleProducerConsumer
Consumer
Producer
public class ExampleProducerConsumer { public static void main(String[] args) { BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); // Shared queue Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start(); // Start producer thread consumerThread.start(); // Start consumer thread } }
Dieses Programm zeigt das Producer-Consumer
-Muster, indem es BlockingQueue
verwendet, um sichere Interaktionen zwischen Threads zu gewährleisten.
Eine BlockingQueue
wird eingerichtet, um als gemeinsamer Puffer für die Producer
- und Consumer
-Threads zu fungieren.
Die Producer
-Klasse erzeugt Zahlen von 0 bis 9 und fügt sie der Warteschlange hinzu, und platziert dann einen Signalwert von -1, um anzuzeigen, dass die Produktion abgeschlossen ist.
Die Consumer
-Klasse ruft wiederholt Zahlen aus der Warteschlange ab. Wenn sie den -1-Signalwert trifft, hört sie auf zu konsumieren.
In der Hauptmethode wird die gemeinsame Warteschlange initialisiert, und die Producer- und Consumer-Threads werden erstellt und gestartet. Der Producer
fügt der Warteschlange Elemente hinzu, während der Consumer
diese Elemente verarbeitet.
Warum wird es verwendet?
Das Producer-Consumer
-Muster wird verwendet, um mehrere Ziele zu erreichen:
- Thread-Synchronisation: Ermöglicht es Threads, Daten auf sichere Weise auszutauschen;
- Leistungsverbesserung: Produzenten und Konsumenten können parallel arbeiten, ohne sich gegenseitig zu blockieren;
- Pufferung: Ein Puffer hilft, Unterschiede in der Produktions- und Verbrauchsgeschwindigkeit auszugleichen.
Hinweis
Das
Producer-Consumer
-Muster hilft, eine sichere und effiziente Interaktion zwischen Threads in der Multithread-Programmierung zu organisieren. Es ermöglicht Produzenten und Konsumenten, unabhängig zu arbeiten, indem ein Puffer zur Synchronisation verwendet wird, was die Leistung verbessert und Blockierungen verhindert.
1. Welche Rolle erfüllt die Producer-Klasse im Producer-Consumer-Muster?
2. Was bewirkt der Signalwert -1 im gegebenen Beispielprogramm?
Danke für Ihr Feedback!