Skip to Content
Suffering builds character

3.패턴 구현

Producer - Consumer 패턴은 두개의 프로세스 or 스레드로 분리하여 구현할 수 있으며,
Producer(이하 생산자)Consumer(이하 소비자)는 공통의 버퍼 or 큐를 공유함

각 포지션별 역할은 다음과 같음

생산자
지속적으로 데이터를 생산하고, 버퍼에 적재

소비자 버퍼에서 데이터를 소비

→ 여기서는 생산자와 소비자를 각각의 개별 스레드로 구현

1. 구현 과정에서 활용되는 클래스

1-1. 데이터를 보관할 클래스, Message

생산자가 생산하고, 소비자가 소비할 데이터를 추상화한 클래스

이러한 Message 클래스는 상용 환경에서는 JSON이나 복잡한 객체, 숫자 등이 될 수 있음

Message.java
public class Message { private double data; // constructors and getter/setters }

1-2. 메시지를 적재할 클래스, DataQueue

메시지를 적재할 클래스

생산자가 생산한 메시지는 Queue에 적재되며,
소비자는 메시지를 소비하기 위해 Queue에서 꺼내 소비

DataQueue.java
public class DataQueue { private final Queue<Message> queue = new LinkedList<>(); // 프로듀서가 큐에 메시지를 적재 public void add(Message message) { queue.add(message); } // 컨슈머가 큐에서 메시지를 꺼내 소비 public Message poll() { Message poppedMessage = queue.poll(); return poppedMessage; } // etc.. }

1-3. 메시지를 생산할 생산자 클래스, Producer

메시지의 생산은 Producer 클래스를 통해 생성되어 큐에 적재됨

Producer.java
public class Producer implements Runnable { private final DataQueue dataQueue; public void run() { produce(); } public void produce() { for (int i = 0; i < 5; i++) { Message message = produceMessage(); dataQueue.add(message); } } // ... }

1-4. 메시지를 소비할 소비자 클래스, Consumer

메시지의 소비는 Consumer 클래스를 통해 소비됨

Consumer.java
public class Consumer implements Runnable { private final DataQueue dataQueue; public void consume() { for (int i = 0; i < 5; i++) { Message message = dataQueue.poll(); consumeMessage(message); } } // ... }
Last updated on