Java BlockingQueue 예제
오늘은 Java BlockingQueue에 대해 살펴보겠습니다. java.util.concurrent.BlockingQueue
는 요소를 검색하고 제거할 때 대기열이 비어 있지 않을 때까지 대기하고 추가할 때 대기열에서 공간이 사용 가능해질 때까지 기다리는 작업을 지원하는 Java 대기열입니다. 요소.
Java BlockingQueue

put(E e)
: 이 메서드는 큐에 요소를 삽입하는 데 사용됩니다. 대기열이 가득 차면 공간이 사용 가능할 때까지 기다립니다.E take()
: 이 메서드는 큐의 헤드에서 요소를 검색하고 제거합니다. 대기열이 비어 있으면 요소를 사용할 수 있을 때까지 기다립니다.
이제 java BlockingQueue를 사용하여 생산자 소비자 문제를 구현해 봅시다.
Java BlockingQueue 예제 - 메시지
Producer에서 생성되어 대기열에 추가되는 일반 Java 개체입니다. 페이로드 또는 대기열 메시지로 호출할 수도 있습니다.
package com.journaldev.concurrency;
public class Message {
private String msg;
public Message(String str){
this.msg=str;
}
public String getMsg() {
return msg;
}
}
Java BlockingQueue 예제 - 생산자
메시지를 생성하고 대기열에 넣을 생산자 클래스입니다.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
private BlockingQueue<Message> queue;
public Producer(BlockingQueue<Message> q){
this.queue=q;
}
@Override
public void run() {
//produce messages
for(int i=0; i<100; i++){
Message msg = new Message(""+i);
try {
Thread.sleep(i);
queue.put(msg);
System.out.println("Produced "+msg.getMsg());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//adding exit message
Message msg = new Message("exit");
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Java BlockingQueue 예제 - 소비자
대기열의 메시지를 처리하고 종료 메시지를 받으면 종료되는 소비자 클래스입니다.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable{
private BlockingQueue<Message> queue;
public Consumer(BlockingQueue<Message> q){
this.queue=q;
}
@Override
public void run() {
try{
Message msg;
//consuming messages until exit message is received
while((msg = queue.take()).getMsg() !="exit"){
Thread.sleep(10);
System.out.println("Consumed "+msg.getMsg());
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
Java BlockingQueue 예제 - 서비스
마지막으로 생산자와 소비자를 위한 BlockingQueue 서비스를 만들어야 합니다. 이 생산자 소비자 서비스는 고정 크기의 BlockingQueue를 생성하고 생산자와 소비자 모두와 공유합니다. 이 서비스는 생산자 및 소비자 스레드를 시작하고 종료합니다.
package com.journaldev.concurrency;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ProducerConsumerService {
public static void main(String[] args) {
//Creating BlockingQueue of size 10
BlockingQueue<Message> queue = new ArrayBlockingQueue<>(10);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
//starting producer to produce messages in queue
new Thread(producer).start();
//starting consumer to consume messages from queue
new Thread(consumer).start();
System.out.println("Producer and Consumer has been started");
}
}
위의 자바 BlockingQueue 예제 프로그램의 출력은 아래와 같습니다.
Producer and Consumer has been started
Produced 0
Produced 1
Produced 2
Produced 3
Produced 4
Consumed 0
Produced 5
Consumed 1
Produced 6
Produced 7
Consumed 2
Produced 8
...
Java 스레드 수면은 생산자와 소비자에서 약간의 지연으로 메시지를 생성하고 소비하는 데 사용됩니다.