Producent-Konsument
Bra jobbat! Du har kommit långt, och vi har gått igenom mycket teori och praktiska exempel!
Du har kanske stött på Producer-Consumer-mönstret i andra avsnitt, men kanske inte insett det. I detta avsnitt kommer vi att diskutera det utförligt, och om något från tidigare exempel var oklart kommer det att bli tydligt i detta avsnitt!
Producer-Consumer-mönstret involverar två typer av trådar, vilket framgår av namnet: Producer och Consumer.
Producer kommer att producera data som den lägger i en delad buffer/kö som även Consumer har tillgång till, och den kommer helt enkelt att konsumera denna data från lagringsplatsen.
Huvudsyftet med mönstret är att separera produktion och konsumtion av data, vilket möjliggör att producenter kan arbeta oberoende av konsumenter.
Användningsområden
Detta mönster används ofta i system där asynkron databehandling krävs. Vi kommer att undersöka vad asynchrony innebär mer i detalj senare.
I praktiken används detta mönster ofta för händelsehanteringssystem, datalogging, hantering av nätverksförfrågningar och parallell databehandling.
Föreställ dig ett transportband i en fabrik där en arbetare placerar delar på transportbandet (producent) och en annan arbetare tar bort och monterar dem till en produkt (konsument). Producenten och konsumenten kan arbeta i olika hastigheter, men transportbandet (buffert) hjälper dem att hålla sig synkroniserade.
Hur ser det ut i kod?
Låt oss titta på ett exempel på hur man använder BlockingQueue för att implementera mönstret Producer-Consumer.
Du kan växla mellan flikar, och det är så du får tillgång till den kod du behöver.
ExampleProducerConsumer.java
Consumer.java
Producer.java
12345678910public 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 } }
Detta program demonstrerar mönstret Producer-Consumer genom att använda BlockingQueue för att säkerställa säkra interaktioner mellan trådar.
En BlockingQueue upprättas för att fungera som en delad buffert för trådarna Producer och Consumer.
Klassen Producer genererar tal från 0 till 9 och lägger till dem i kön, och placerar sedan ett signalvärde -1 för att indikera att produktionen är avslutad.
Klassen Consumer hämtar upprepade gånger tal från kön. När den stöter på signalvärdet -1 slutar den konsumera.
I huvudmetoden initieras den delade kön, och producer- och consumer-trådarna skapas och startas. Producer lägger till objekt i kön medan Consumer behandlar dessa objekt.
Varför används det?
Mönstret Producer-Consumer används för att uppnå flera mål:
- Trådsynkronisering: Möjliggör säker datautväxling mellan trådar;
- Prestandaförbättring: Producenter och konsumenter kan arbeta parallellt utan att blockera varandra;
- Buffring: Bufferten hjälper till att balansera skillnader i produktions- och konsumtionshastigheter.
Mönstret Producer-Consumer hjälper till att organisera säker och effektiv interaktion mellan trådar i multitrådad programmering. Det möjliggör att producenter och konsumenter kan arbeta oberoende med hjälp av en buffert för synkronisering, vilket förbättrar prestanda och förhindrar blockering.
1. Vilken roll uppfyller Producer-klassen i Producer-Consumer-mönstret?
2. Vad gör signalvärdet -1 i det givna exempelprogrammet?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 3.33
Producent-Konsument
Svep för att visa menyn
Bra jobbat! Du har kommit långt, och vi har gått igenom mycket teori och praktiska exempel!
Du har kanske stött på Producer-Consumer-mönstret i andra avsnitt, men kanske inte insett det. I detta avsnitt kommer vi att diskutera det utförligt, och om något från tidigare exempel var oklart kommer det att bli tydligt i detta avsnitt!
Producer-Consumer-mönstret involverar två typer av trådar, vilket framgår av namnet: Producer och Consumer.
Producer kommer att producera data som den lägger i en delad buffer/kö som även Consumer har tillgång till, och den kommer helt enkelt att konsumera denna data från lagringsplatsen.
Huvudsyftet med mönstret är att separera produktion och konsumtion av data, vilket möjliggör att producenter kan arbeta oberoende av konsumenter.
Användningsområden
Detta mönster används ofta i system där asynkron databehandling krävs. Vi kommer att undersöka vad asynchrony innebär mer i detalj senare.
I praktiken används detta mönster ofta för händelsehanteringssystem, datalogging, hantering av nätverksförfrågningar och parallell databehandling.
Föreställ dig ett transportband i en fabrik där en arbetare placerar delar på transportbandet (producent) och en annan arbetare tar bort och monterar dem till en produkt (konsument). Producenten och konsumenten kan arbeta i olika hastigheter, men transportbandet (buffert) hjälper dem att hålla sig synkroniserade.
Hur ser det ut i kod?
Låt oss titta på ett exempel på hur man använder BlockingQueue för att implementera mönstret Producer-Consumer.
Du kan växla mellan flikar, och det är så du får tillgång till den kod du behöver.
ExampleProducerConsumer.java
Consumer.java
Producer.java
12345678910public 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 } }
Detta program demonstrerar mönstret Producer-Consumer genom att använda BlockingQueue för att säkerställa säkra interaktioner mellan trådar.
En BlockingQueue upprättas för att fungera som en delad buffert för trådarna Producer och Consumer.
Klassen Producer genererar tal från 0 till 9 och lägger till dem i kön, och placerar sedan ett signalvärde -1 för att indikera att produktionen är avslutad.
Klassen Consumer hämtar upprepade gånger tal från kön. När den stöter på signalvärdet -1 slutar den konsumera.
I huvudmetoden initieras den delade kön, och producer- och consumer-trådarna skapas och startas. Producer lägger till objekt i kön medan Consumer behandlar dessa objekt.
Varför används det?
Mönstret Producer-Consumer används för att uppnå flera mål:
- Trådsynkronisering: Möjliggör säker datautväxling mellan trådar;
- Prestandaförbättring: Producenter och konsumenter kan arbeta parallellt utan att blockera varandra;
- Buffring: Bufferten hjälper till att balansera skillnader i produktions- och konsumtionshastigheter.
Mönstret Producer-Consumer hjälper till att organisera säker och effektiv interaktion mellan trådar i multitrådad programmering. Det möjliggör att producenter och konsumenter kan arbeta oberoende med hjälp av en buffert för synkronisering, vilket förbättrar prestanda och förhindrar blockering.
1. Vilken roll uppfyller Producer-klassen i Producer-Consumer-mönstret?
2. Vad gör signalvärdet -1 i det givna exempelprogrammet?
Tack för dina kommentarer!