Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Produzent-Konsument | Multithreading Best Practices
Multithreading in Java

bookProduzent-Konsument

Großartige Arbeit! Sie haben bereits viel erreicht, und wir haben zahlreiche theoretische sowie praktische Beispiele behandelt!

Möglicherweise sind Sie bereits im Zusammenhang mit anderen Abschnitten auf das Producer-Consumer-Muster gestoßen, ohne es bewusst wahrzunehmen. In diesem Abschnitt werden wir es ausführlich besprechen. Falls in den bisherigen Beispielen noch Unklarheiten bestanden, werden diese in diesem Abschnitt beseitigt!

Das Producer-Consumer-Muster umfasst zwei Arten von Threads, was bereits aus dem Namen hervorgeht: Producer und Consumer.

Der Producer erzeugt Daten, die er in einen gemeinsamen Puffer/Queue einfügt, auf den auch der Consumer Zugriff hat. Dieser verbraucht die Daten einfach aus dem Datenspeicherort.

Note
Hinweis

Das Hauptziel des Musters besteht darin, die Produktion und den Verbrauch von Daten zu trennen, sodass Produzenten unabhängig von Konsumenten arbeiten können.

Anwendungsbereiche

Dieses Muster wird häufig in Systemen eingesetzt, in denen eine asynchrone Datenverarbeitung erforderlich ist. Wir werden später im Detail erläutern, was asynchrony bedeutet.

In der Praxis wird dieses Muster oft für Ereignisverarbeitungssysteme, Datenprotokollierung, Netzwerk-Anfragebearbeitung und parallele Datenverarbeitung verwendet.

Stellen Sie sich ein Fließband in einer Fabrik vor, auf das ein Arbeiter Teile legt (Produzent), während ein anderer Arbeiter diese entnimmt und zu einem Produkt zusammenbaut (Konsument). Der Produzent und der Konsument können mit unterschiedlichen Geschwindigkeiten arbeiten, aber das Fließband (Puffer) hilft ihnen, im Gleichklang zu bleiben.

Wie sieht das im Code aus?

Ein Beispiel für die Verwendung von BlockingQueue zur Implementierung des Producer-Consumer-Musters.

Note
Hinweis

Sie können zwischen den Tabs wechseln, um auf den benötigten Code zuzugreifen.

ExampleProducerConsumer.java

ExampleProducerConsumer.java

Consumer.java

Consumer.java

Producer.java

Producer.java

copy
12345678910
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 demonstriert das Producer-Consumer-Muster durch die Verwendung von BlockingQueue, um sichere Interaktionen zwischen Threads zu gewährleisten.

Eine BlockingQueue wird eingerichtet, um als gemeinsamer Puffer für die Producer- und Consumer-Threads zu dienen.

Die Klasse Producer erzeugt Zahlen von 0 bis 9 und fügt sie der Queue hinzu. Anschließend wird ein Signalwert von -1 eingefügt, um anzuzeigen, dass die Produktion abgeschlossen ist.

Die Klasse Consumer entnimmt wiederholt Zahlen aus der Queue. Sobald der Signalwert -1 erkannt wird, beendet sie den Konsum.

In der main-Methode wird die gemeinsame Queue initialisiert und die Producer- sowie Consumer-Threads werden erstellt und gestartet. Der Producer fügt Elemente zur Queue hinzu, während der Consumer diese Elemente verarbeitet.

Warum wird es verwendet?

Das Producer-Consumer-Muster wird eingesetzt, um mehrere Ziele zu erreichen:

  • Thread-Synchronisation: Ermöglicht Threads einen sicheren Datenaustausch;
  • Leistungsverbesserung: Producer und Consumer können parallel arbeiten, ohne sich gegenseitig zu blockieren;
  • Pufferung: Der Puffer hilft, Unterschiede in der Produktions- und Verbrauchsgeschwindigkeit auszugleichen.
Note
Hinweis

Das Producer-Consumer-Muster unterstützt eine sichere und effiziente Interaktion zwischen Threads in der nebenläufigen Programmierung. Es ermöglicht Producern und Consumern, unabhängig voneinander mithilfe eines Puffers zur Synchronisation zu arbeiten, was die Leistung verbessert und Blockierungen verhindert.

1. Welche Rolle erfüllt die Producer-Klasse im Producer-Consumer-Muster?

2. Welche Funktion hat der Signalwert -1 im gegebenen Beispielprogramm?

question mark

Welche Rolle erfüllt die Producer-Klasse im Producer-Consumer-Muster?

Select the correct answer

question mark

Welche Funktion hat der Signalwert -1 im gegebenen Beispielprogramm?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 1

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

Can you explain how BlockingQueue works in the Producer-Consumer pattern?

What are some real-world scenarios where the Producer-Consumer pattern is useful?

Can you show a simple code example of the Producer-Consumer pattern?

Awesome!

Completion rate improved to 3.33

bookProduzent-Konsument

Swipe um das Menü anzuzeigen

Großartige Arbeit! Sie haben bereits viel erreicht, und wir haben zahlreiche theoretische sowie praktische Beispiele behandelt!

Möglicherweise sind Sie bereits im Zusammenhang mit anderen Abschnitten auf das Producer-Consumer-Muster gestoßen, ohne es bewusst wahrzunehmen. In diesem Abschnitt werden wir es ausführlich besprechen. Falls in den bisherigen Beispielen noch Unklarheiten bestanden, werden diese in diesem Abschnitt beseitigt!

Das Producer-Consumer-Muster umfasst zwei Arten von Threads, was bereits aus dem Namen hervorgeht: Producer und Consumer.

Der Producer erzeugt Daten, die er in einen gemeinsamen Puffer/Queue einfügt, auf den auch der Consumer Zugriff hat. Dieser verbraucht die Daten einfach aus dem Datenspeicherort.

Note
Hinweis

Das Hauptziel des Musters besteht darin, die Produktion und den Verbrauch von Daten zu trennen, sodass Produzenten unabhängig von Konsumenten arbeiten können.

Anwendungsbereiche

Dieses Muster wird häufig in Systemen eingesetzt, in denen eine asynchrone Datenverarbeitung erforderlich ist. Wir werden später im Detail erläutern, was asynchrony bedeutet.

In der Praxis wird dieses Muster oft für Ereignisverarbeitungssysteme, Datenprotokollierung, Netzwerk-Anfragebearbeitung und parallele Datenverarbeitung verwendet.

Stellen Sie sich ein Fließband in einer Fabrik vor, auf das ein Arbeiter Teile legt (Produzent), während ein anderer Arbeiter diese entnimmt und zu einem Produkt zusammenbaut (Konsument). Der Produzent und der Konsument können mit unterschiedlichen Geschwindigkeiten arbeiten, aber das Fließband (Puffer) hilft ihnen, im Gleichklang zu bleiben.

Wie sieht das im Code aus?

Ein Beispiel für die Verwendung von BlockingQueue zur Implementierung des Producer-Consumer-Musters.

Note
Hinweis

Sie können zwischen den Tabs wechseln, um auf den benötigten Code zuzugreifen.

ExampleProducerConsumer.java

ExampleProducerConsumer.java

Consumer.java

Consumer.java

Producer.java

Producer.java

copy
12345678910
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 demonstriert das Producer-Consumer-Muster durch die Verwendung von BlockingQueue, um sichere Interaktionen zwischen Threads zu gewährleisten.

Eine BlockingQueue wird eingerichtet, um als gemeinsamer Puffer für die Producer- und Consumer-Threads zu dienen.

Die Klasse Producer erzeugt Zahlen von 0 bis 9 und fügt sie der Queue hinzu. Anschließend wird ein Signalwert von -1 eingefügt, um anzuzeigen, dass die Produktion abgeschlossen ist.

Die Klasse Consumer entnimmt wiederholt Zahlen aus der Queue. Sobald der Signalwert -1 erkannt wird, beendet sie den Konsum.

In der main-Methode wird die gemeinsame Queue initialisiert und die Producer- sowie Consumer-Threads werden erstellt und gestartet. Der Producer fügt Elemente zur Queue hinzu, während der Consumer diese Elemente verarbeitet.

Warum wird es verwendet?

Das Producer-Consumer-Muster wird eingesetzt, um mehrere Ziele zu erreichen:

  • Thread-Synchronisation: Ermöglicht Threads einen sicheren Datenaustausch;
  • Leistungsverbesserung: Producer und Consumer können parallel arbeiten, ohne sich gegenseitig zu blockieren;
  • Pufferung: Der Puffer hilft, Unterschiede in der Produktions- und Verbrauchsgeschwindigkeit auszugleichen.
Note
Hinweis

Das Producer-Consumer-Muster unterstützt eine sichere und effiziente Interaktion zwischen Threads in der nebenläufigen Programmierung. Es ermöglicht Producern und Consumern, unabhängig voneinander mithilfe eines Puffers zur Synchronisation zu arbeiten, was die Leistung verbessert und Blockierungen verhindert.

1. Welche Rolle erfüllt die Producer-Klasse im Producer-Consumer-Muster?

2. Welche Funktion hat der Signalwert -1 im gegebenen Beispielprogramm?

question mark

Welche Rolle erfüllt die Producer-Klasse im Producer-Consumer-Muster?

Select the correct answer

question mark

Welche Funktion hat der Signalwert -1 im gegebenen Beispielprogramm?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 1
some-alt