生产者消费者问题 java实现
管程法
通过一个缓冲区来控制生产者和消费者的放入和消耗
public class PCdemo1 {
public static void main(String[] args) {
SynContainer container=new SynContainer();
Producer producer=new Producer(container);
Consumer consumer=new Consumer(container);
new Thread(producer).start();
new Thread(consumer).start();
}
}
//需要 生产者,消费者,缓冲区,物品4个类
class Producer implements Runnable{
SynContainer container;
public Producer(SynContainer container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("生产了第"+i+"个物品 ");
Item item=new Item(i);
try {
container.push(item);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
SynContainer container;
public Consumer(SynContainer container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
System.out.println("使用了第"+container.consume().getId()+"物品");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class SynContainer{
//开辟一个能放10个物品的数组
Item[] items=new Item[10];
private int in=0;//放入的下标
private int out=0;//拿出来的下标
private int count=0;//计数器
public synchronized void push(Item item) throws InterruptedException {
int N=items.length;
//如果满了 等待消费者
while(count>=N){
this.wait();
}
items[in]=item;
in=(in+1)%N;
count++;
//物品放入 提醒消费者
this.notifyAll();
}
public synchronized Item consume() throws InterruptedException {
//没东西了 只能等
Item item=null;
int N=items.length;
while(count<=0){
this.wait();
}
count--;
item=items[out];
out=(out+1)%N;
//物品消耗,提醒生产者
this.notifyAll();
return item;
}
}
class Item{
private int id;
public Item(int id) {
this.id = id;
}
public int getId() {
return id;
}
}