直接上代码
/**
* 生产者消费者模型
*
* 管程法
*
* 关键因素:生产者,消费者,产品,缓冲区
*/
public class PCTest {
public static void main(String[] args) {
SynContainer container = new SynContainer();
Productor productor = new Productor(container);
productor.start();
Consumer consumer = new Consumer(container);
consumer.start();
}
}
/**
* 生产者
*/
class Productor extends Thread {
SynContainer container;
public Productor(SynContainer container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
container.push(new Chicken(i));
System.out.println("生产了" + i + "只鸡");
}
}
}
/**
* 消费者
*/
class Consumer extends Thread {
SynContainer container;
public Consumer(SynContainer container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消费了---->" + container.pop().getId() + "只鸡");
}
}
}
/**
* 产品:鸡
*/
class Chicken {
/**
* 编号
*/
private int id;
public Chicken(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
/**
* 缓冲区
*/
class SynContainer {
/**
* 消费产品
*/
Chicken[] chickens = new Chicken[10];
/**
* 容器计数器
*/
int count = 0;
/**
* 生产者生产产品
*
* @param chicken
*/
public synchronized void push(Chicken chicken) {
// 如果容器满了需要等待消费者消费
if (count == chickens.length) {
// 通知消费者消费,生产等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果没有满则丢入产品
chickens[count] = chicken;
count++;
// 通知消费者消费
this.notifyAll();
}
/**
* 消费者消费产品
*/
public synchronized Chicken pop() {
// 判断能否消费
if (count == 0) {
// 等待生产者生产,消费者等待
try {
// 进入线程等待
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果可以消费
count--;
Chicken chicken = chickens[count];
// 通知生产者生产
// 唤醒所有进入wait的线程
this.notifyAll();
return chicken;
}
}