From 07faa2f6250e00da02d5927c6c6b198dd12ba44c Mon Sep 17 00:00:00 2001 From: hongsw Date: Wed, 28 Oct 2015 09:55:05 +0800 Subject: [PATCH] #271 implements producer-consumer --- pom.xml | 1 + producer-consumer/etc/producer-consumer.png | Bin 0 -> 27122 bytes producer-consumer/etc/producer-consumer.ucls | 74 ++++++++++++++++++ producer-consumer/index.md | 22 ++++++ producer-consumer/pom.xml | 18 +++++ .../com/iluwatar/producer/consumer/App.java | 57 ++++++++++++++ .../iluwatar/producer/consumer/Consumer.java | 24 ++++++ .../com/iluwatar/producer/consumer/Item.java | 27 +++++++ .../iluwatar/producer/consumer/ItemQueue.java | 27 +++++++ .../iluwatar/producer/consumer/Producer.java | 29 +++++++ .../com/iluwatar/poison/pill/AppTest.java | 20 +++++ 11 files changed, 299 insertions(+) create mode 100644 producer-consumer/etc/producer-consumer.png create mode 100644 producer-consumer/etc/producer-consumer.ucls create mode 100644 producer-consumer/index.md create mode 100644 producer-consumer/pom.xml create mode 100644 producer-consumer/src/main/java/com/iluwatar/producer/consumer/App.java create mode 100644 producer-consumer/src/main/java/com/iluwatar/producer/consumer/Consumer.java create mode 100644 producer-consumer/src/main/java/com/iluwatar/producer/consumer/Item.java create mode 100644 producer-consumer/src/main/java/com/iluwatar/producer/consumer/ItemQueue.java create mode 100644 producer-consumer/src/main/java/com/iluwatar/producer/consumer/Producer.java create mode 100644 producer-consumer/src/test/java/com/iluwatar/poison/pill/AppTest.java diff --git a/pom.xml b/pom.xml index 4cb30df3f..0222d7e37 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ execute-around property intercepting-filter + producer-consumer poison-pill lazy-loading service-layer diff --git a/producer-consumer/etc/producer-consumer.png b/producer-consumer/etc/producer-consumer.png new file mode 100644 index 0000000000000000000000000000000000000000..e8bc573b388fe73e5a88d0f690d5c22cbbe8f700 GIT binary patch literal 27122 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 Ux~Sk@72)4ykP6o_CGU9rA6j$#g8%>k literal 0 HcmV?d00001 diff --git a/producer-consumer/etc/producer-consumer.ucls b/producer-consumer/etc/producer-consumer.ucls new file mode 100644 index 000000000..aa1ee80c0 --- /dev/null +++ b/producer-consumer/etc/producer-consumer.ucls @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/producer-consumer/index.md b/producer-consumer/index.md new file mode 100644 index 000000000..58dc45e0d --- /dev/null +++ b/producer-consumer/index.md @@ -0,0 +1,22 @@ +--- +layout: pattern +title: Producer Consumer +folder: producer-consumer +permalink: /patterns/producer-consumer/ +categories: Other +tags: Java +--- + +**Intent:** Producer Consumer Design pattern is a classic concurrency or threading pattern which reduces + coupling between Producer and Consumer by separating Identification of work with Execution of + Work.. + + + +![alt text](./etc/producer-consumer.png "Producer Consumer") + +**Applicability:** Use the Producer Consumer idiom when + +* decouple system by separate work in two process produce and consume. +* addresses the issue of different timing require to produce work or consuming work + diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml new file mode 100644 index 000000000..475c7fb6c --- /dev/null +++ b/producer-consumer/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.7.0 + + producer-consumer + + + junit + junit + test + + + diff --git a/producer-consumer/src/main/java/com/iluwatar/producer/consumer/App.java b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/App.java new file mode 100644 index 000000000..50d94d92f --- /dev/null +++ b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/App.java @@ -0,0 +1,57 @@ +package com.iluwatar.producer.consumer; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +/** + * Producer Consumer Design pattern is a classic concurrency or threading pattern which reduces + * coupling between Producer and Consumer by separating Identification of work with Execution of + * Work. + *

+ * In producer consumer design pattern a shared queue is used to control the flow and this + * separation allows you to code producer and consumer separately. It also addresses the issue of + * different timing require to produce item or consuming item. by using producer consumer pattern + * both Producer and Consumer Thread can work with different speed. + * + */ +public class App { + + /** + * Program entry point + * + * @param args command line args + */ + public static void main(String[] args) { + + ItemQueue queue = new ItemQueue(); + + ExecutorService executorService = Executors.newFixedThreadPool(5); + for (int i = 0; i < 2; i++) { + + final Producer producer = new Producer("Producer_" + i, queue); + executorService.submit(() -> { + while (true) { + producer.produce(); + } + }); + }; + + for (int i = 0; i < 3; i++) { + final Consumer consumer = new Consumer("Consumer_" + i, queue); + executorService.submit(() -> { + while (true) { + consumer.consume(); + } + }); + } + + executorService.shutdown(); + try { + executorService.awaitTermination(10, TimeUnit.SECONDS); + executorService.shutdownNow(); + } catch (InterruptedException e) { + System.out.println("Error waiting for ExecutorService shutdown"); + } + } +} diff --git a/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Consumer.java b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Consumer.java new file mode 100644 index 000000000..8bb3b75b6 --- /dev/null +++ b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Consumer.java @@ -0,0 +1,24 @@ +package com.iluwatar.producer.consumer; + +/** + * Class responsible for consume the {@link Item} produced by {@link Producer} + */ +public class Consumer { + + private final ItemQueue queue; + + private final String name; + + public Consumer(String name, ItemQueue queue) { + this.name = name; + this.queue = queue; + } + + public void consume() throws InterruptedException { + + Item item = queue.take(); + System.out.println(String.format("Consumer [%s] consume item [%s] produced by [%s]", name, + item.getId(), item.getProducer())); + + } +} diff --git a/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Item.java b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Item.java new file mode 100644 index 000000000..8d5be69a1 --- /dev/null +++ b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Item.java @@ -0,0 +1,27 @@ +package com.iluwatar.producer.consumer; + +/** + * Class take part of an {@link Producer}-{@link Consumer} exchange. + */ +public class Item { + + private String producer; + + private int id; + + public Item(String producer, int id) { + this.id = id; + this.producer = producer; + } + + public int getId() { + + return id; + } + + public String getProducer() { + + return producer; + } + +} diff --git a/producer-consumer/src/main/java/com/iluwatar/producer/consumer/ItemQueue.java b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/ItemQueue.java new file mode 100644 index 000000000..8d41fb456 --- /dev/null +++ b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/ItemQueue.java @@ -0,0 +1,27 @@ +package com.iluwatar.producer.consumer; + +import java.util.concurrent.LinkedBlockingQueue; + +/** + * Class as a channel for {@link Producer}-{@link Consumer} exchange. + */ +public class ItemQueue { + + private LinkedBlockingQueue queue; + + public ItemQueue() { + + queue = new LinkedBlockingQueue(5); + } + + public void put(Item item) throws InterruptedException { + + queue.put(item); + } + + public Item take() throws InterruptedException { + + return queue.take(); + } + +} diff --git a/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Producer.java b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Producer.java new file mode 100644 index 000000000..40e71c607 --- /dev/null +++ b/producer-consumer/src/main/java/com/iluwatar/producer/consumer/Producer.java @@ -0,0 +1,29 @@ +package com.iluwatar.producer.consumer; + +import java.util.Random; + +/** + * Class responsible for producing unit of work that can be expressed as {@link Item} and submitted + * to queue + */ +public class Producer { + + private final ItemQueue queue; + + private final String name; + + private int itemId = 0; + + public Producer(String name, ItemQueue queue) { + this.name = name; + this.queue = queue; + } + + public void produce() throws InterruptedException { + + Item item = new Item(name, itemId++); + queue.put(item); + Random random = new Random(); + Thread.sleep(random.nextInt(2000)); + } +} diff --git a/producer-consumer/src/test/java/com/iluwatar/poison/pill/AppTest.java b/producer-consumer/src/test/java/com/iluwatar/poison/pill/AppTest.java new file mode 100644 index 000000000..26b38dec0 --- /dev/null +++ b/producer-consumer/src/test/java/com/iluwatar/poison/pill/AppTest.java @@ -0,0 +1,20 @@ +package com.iluwatar.poison.pill; + +import org.junit.Test; + +import com.iluwatar.producer.consumer.App; + +/** + * + * Application test + * + */ +public class AppTest { + + @Test + public void test() throws Exception { + String[] args = {}; + App.main(args); + + } +}