一个生产者生产鸡
一个消费者吃鸡
/*测试:生产消费 使用缓冲区 管程法
*
*生产者 消费者 产品 缓冲区
*/
//测试
public class TestPC {
public static void main(String[] args) {
//创建容器
SynContainer container = new SynContainer();
//创建生产者开启线程
new Productor(container).start();
//创建消费者开启线程
new Consumer(container).start();
}
}
//生产者
class Productor extends Thread{
//创建一个容器
SynContainer container;
//构造器 方便创建对象
public Productor(SynContainer container) {
this.container = container;
}
//生产鸡线程run方法
@Override
public void run() {
//生产100只鸡
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().id+"只鸡吧");
}
}
}
//产品鸡
class Chicken{
int id;
public Chicken(int id) {
this.id = id;
}
}
//缓冲区
class SynContainer{
//容器数组
Chicken [] chickens = new Chicken[10];
//计数器
int count = 0;
//生产者放产品
public synchronized void push(Chicken chicken){
//判断容器是否满了,满了就等待不要爆仓
if (count==chickens.length){
//通知消费者消费wait方法
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没有满就要生产商品
chickens[count]=chicken;
count++;
//通知可以消费了notifyall方法
this.notifyAll();
}
//消费者吃鸡
public synchronized Chicken pop(){
//判断是否有鸡
if (count==0){
//等待生产
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//消费后的容器减少
count--;
Chicken chicken =chickens[count];
//吃完没了通知生产
this.notifyAll();
//返回还有多少只鸡
return chicken ;
}
}