Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Producent-Forbruger | Bedste Praksis for Multitrådning
Multitrådning i Java

bookProducent-Forbruger

Godt klaret! Du er nået langt, og vi har gennemgået masser af teori og praktiske eksempler!

Du er måske stødt på Producer-Consumer-mønstret i andre afsnit, men har måske ikke lagt mærke til det. I dette afsnit vil vi gennemgå det i detaljer, og hvis noget fra de tidligere eksempler var uklart, vil det blive tydeligt i dette afsnit!

Producer-Consumer-mønstret involverer to typer tråde, hvilket fremgår af navnet: Producer og Consumer.

Producer producerer nogle data, som den lægger i en delt buffer/kø, som Consumer også har adgang til, og den vil blot forbruge disse data fra datastore-placeringen.

Note
Bemærk

Hovedformålet med mønsteret er at adskille produktion og forbrug af data, hvilket gør det muligt for producenter at fungere uafhængigt af forbrugere.

Anvendelsesområder

Dette mønster anvendes ofte i systemer, hvor der kræves asynkron databehandling. Vi vil undersøge betydningen af asynchrony mere detaljeret senere.

I praksis benyttes mønsteret ofte til eventbehandlingssystemer, datalogning, håndtering af netværksforespørgsler og parallel databehandling.

Forestil dig et transportbånd på en fabrik, hvor én arbejder lægger dele på transportbåndet (producent), og en anden arbejder fjerner og samler dem til et produkt (forbruger). Producenten og forbrugeren kan arbejde med forskellig hastighed, men transportbåndet (buffer) hjælper dem med at holde trit med hinanden.

Hvordan ser det ud i kode?

Lad os overveje et eksempel på brug af BlockingQueue til at implementere Producer-Consumer-mønstret.

Note
Bemærk

Du kan skifte mellem faner, og det er sådan, du får adgang til den kode, du har brug for.

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 } }

Dette program demonstrerer Producer-Consumer-mønstret ved at anvende BlockingQueue for at sikre sikre interaktioner mellem tråde.

En BlockingQueue oprettes for at fungere som en delt buffer for Producer- og Consumer-trådene.

Producer-klassen genererer tal fra 0 til 9 og tilføjer dem til køen, og indsætter derefter en signalværdi på -1 for at angive, at produktionen er afsluttet.

Consumer-klassen henter gentagne gange tal fra køen. Når den støder på signalværdien -1, stopper den med at forbruge.

I main-metoden initialiseres den delte kø, og producer- og consumer-trådene oprettes og startes. Producer tilføjer elementer til køen, mens Consumer behandler disse elementer.

Hvorfor anvendes det?

Producer-Consumer-mønstret anvendes for at opnå flere mål:

  • Trådsynkronisering: Muliggør sikker dataudveksling mellem tråde;
  • Ydelsesforbedring: Producenter og forbrugere kan arbejde parallelt uden at blokere hinanden;
  • Buffering: Bufferen hjælper med at udligne forskelle i produktions- og forbrugs-hastigheder.
Note
Bemærk

Producer-Consumer-mønstret hjælper med at organisere sikker og effektiv interaktion mellem tråde i multitrådet programmering. Det gør det muligt for producenter og forbrugere at arbejde uafhængigt ved at bruge en buffer til synkronisering, hvilket forbedrer ydelsen og forhindrer blokering.

1. Hvilken rolle opfylder Producer-klassen i Producer-Consumer-mønsteret?

2. Hvad gør signalværdien -1 i det givne eksempelprogram?

question mark

Hvilken rolle opfylder Producer-klassen i Producer-Consumer-mønsteret?

Select the correct answer

question mark

Hvad gør signalværdien -1 i det givne eksempelprogram?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 1

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Awesome!

Completion rate improved to 3.33

bookProducent-Forbruger

Stryg for at vise menuen

Godt klaret! Du er nået langt, og vi har gennemgået masser af teori og praktiske eksempler!

Du er måske stødt på Producer-Consumer-mønstret i andre afsnit, men har måske ikke lagt mærke til det. I dette afsnit vil vi gennemgå det i detaljer, og hvis noget fra de tidligere eksempler var uklart, vil det blive tydeligt i dette afsnit!

Producer-Consumer-mønstret involverer to typer tråde, hvilket fremgår af navnet: Producer og Consumer.

Producer producerer nogle data, som den lægger i en delt buffer/kø, som Consumer også har adgang til, og den vil blot forbruge disse data fra datastore-placeringen.

Note
Bemærk

Hovedformålet med mønsteret er at adskille produktion og forbrug af data, hvilket gør det muligt for producenter at fungere uafhængigt af forbrugere.

Anvendelsesområder

Dette mønster anvendes ofte i systemer, hvor der kræves asynkron databehandling. Vi vil undersøge betydningen af asynchrony mere detaljeret senere.

I praksis benyttes mønsteret ofte til eventbehandlingssystemer, datalogning, håndtering af netværksforespørgsler og parallel databehandling.

Forestil dig et transportbånd på en fabrik, hvor én arbejder lægger dele på transportbåndet (producent), og en anden arbejder fjerner og samler dem til et produkt (forbruger). Producenten og forbrugeren kan arbejde med forskellig hastighed, men transportbåndet (buffer) hjælper dem med at holde trit med hinanden.

Hvordan ser det ud i kode?

Lad os overveje et eksempel på brug af BlockingQueue til at implementere Producer-Consumer-mønstret.

Note
Bemærk

Du kan skifte mellem faner, og det er sådan, du får adgang til den kode, du har brug for.

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 } }

Dette program demonstrerer Producer-Consumer-mønstret ved at anvende BlockingQueue for at sikre sikre interaktioner mellem tråde.

En BlockingQueue oprettes for at fungere som en delt buffer for Producer- og Consumer-trådene.

Producer-klassen genererer tal fra 0 til 9 og tilføjer dem til køen, og indsætter derefter en signalværdi på -1 for at angive, at produktionen er afsluttet.

Consumer-klassen henter gentagne gange tal fra køen. Når den støder på signalværdien -1, stopper den med at forbruge.

I main-metoden initialiseres den delte kø, og producer- og consumer-trådene oprettes og startes. Producer tilføjer elementer til køen, mens Consumer behandler disse elementer.

Hvorfor anvendes det?

Producer-Consumer-mønstret anvendes for at opnå flere mål:

  • Trådsynkronisering: Muliggør sikker dataudveksling mellem tråde;
  • Ydelsesforbedring: Producenter og forbrugere kan arbejde parallelt uden at blokere hinanden;
  • Buffering: Bufferen hjælper med at udligne forskelle i produktions- og forbrugs-hastigheder.
Note
Bemærk

Producer-Consumer-mønstret hjælper med at organisere sikker og effektiv interaktion mellem tråde i multitrådet programmering. Det gør det muligt for producenter og forbrugere at arbejde uafhængigt ved at bruge en buffer til synkronisering, hvilket forbedrer ydelsen og forhindrer blokering.

1. Hvilken rolle opfylder Producer-klassen i Producer-Consumer-mønsteret?

2. Hvad gør signalværdien -1 i det givne eksempelprogram?

question mark

Hvilken rolle opfylder Producer-klassen i Producer-Consumer-mønsteret?

Select the correct answer

question mark

Hvad gør signalværdien -1 i det givne eksempelprogram?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 1
some-alt