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