Java 병렬 프로그래밍에서의 생산자와 소비자 모델 약술
다중 루틴 프로그램에 대해 말하자면 생산자와 소비자 모델은 매우 고전적인 모델이다.더 정확히 말하면'생산자-소비자-창고모형'이라고 해야 한다.창고를 떠나면 생산자, 소비자는 공용 저장 공간이 부족하고 협업이 아닌 문제가 존재하지 않는다.
예제
장면을 정의합니다.창고 하나에 10개의 상품만 보관할 수 있고 생산자는 매번 그 안에 하나의 상품을 넣을 수 있으며 소비자는 그 중에서 하나의 상품을 꺼낼 수 있다.또한 다음 4가지 사항을 유의해야 합니다.
1. 같은 시간에 한 명의 생산자만 생산할 수 있고 생산 방법은synchronized를 잠가야 한다.
2. 같은 시간에 한 명의 소비자만 소비할 수 있고 소비 방법은synchronized를 잠가야 한다.
3. 창고가 비어 있을 때 소비자는 계속 소비할 수 없다.소비자가 소비하기 전에 현재 창고 상태가 비어 있는지 순환적으로 판단하고 비어 있으면 소비 라인은wait를 필요로 하며 자물쇠를 방출하여 다른 동기화 방법을 실행할 수 있도록 한다.
4. 창고가 가득 차면 생산자는 계속 생산할 수 없고 생산자의 생산돈은 현재 창고 상태가 가득 차는지 순환적으로 판단해야 한다. 가득 차면 생산 라인은wait를 필요로 하고 자물쇠를 풀어 다른 동기화 방법으로 실행할 수 있도록 해야 한다.
예제 코드는 다음과 같습니다.
public class Concurrence {
public static void main(String[] args) {
WareHouse wareHouse = new WareHouse();
Producer producer = new Producer(wareHouse);
Consumer consumer = new Consumer(wareHouse);
new Thread(producer).start();
new Thread(consumer).start();
}
}
class WareHouse {
private static final int STORE_SIZE = 10;
private String[] storeProducts = new String[STORE_SIZE];
private int index = 0;
public void pushProduct(String product) {
synchronized (this) {
while (index == STORE_SIZE) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
storeProducts[index++] = product;
this.notify();
System.out.println(" : " + product + " , : " + index
+ " ");
}
}
public synchronized String getProduct() {
synchronized (this) {
while (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String product = storeProducts[index - 1];
index--;
System.out.println(" : " + product + ", : " + index
+ " ");
this.notify();
return product;
}
}
}
class Producer implements Runnable {
WareHouse wareHouse;
public Producer(WareHouse wh) {
this.wareHouse = wh;
}
@Override
public void run() {
for (int i = 0; i < 40; i++) {
String product = "product" + i;
this.wareHouse.pushProduct(product);
}
}
}
class Consumer implements Runnable {
WareHouse wareHouse;
public Consumer(WareHouse wh) {
this.wareHouse = wh;
}
@Override
public void run() {
for (int i = 0; i < 40; i++) {
this.wareHouse.getProduct();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.