package com.kuang.Demo10生产者管理者;
//测试:生产者消费者模型-->利用缓冲区解决:管程法
//生产者 , 消费者 , 产品 ,缓冲区
public class TestPC {
// 主线程
public static void main(String[] args) {
SynContainer synContainer = new SynContainer();
new Productor(synContainer).start();
new Consumer(synContainer).start();
}
}
//生产者
class Productor extends Thread{
SynContainer synContainer;
//通过构造器把 容器的对象赋予给Productor对象 productor对象就可以使用容器的方法了
public Productor(SynContainer synContainer){
this.synContainer=synContainer;
}
// 生产者和消费者都是通过线程并发运行的!
// 所以要重写run方法
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("生产了"+i+"只鸡");
synContainer.push(new Chicken(i));
}
}
}
//消费者
class Consumer extends Thread{
SynContainer synContainer;
public Consumer(SynContainer synContainer){
this.synContainer=synContainer;
}
//消费
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消费了-->"+synContainer.pop().id+"只鸡");
}
}
}
//产品
class Chicken{
int id;
public Chicken(int id){
this.id=id;
}
}
//缓冲区
class SynContainer{
//需要一个容器大小 ,保存的是一个一个的对象
Chicken[] chickens=new Chicken[10];
// 设置一个容器计数器
int count=0;
//生产者放入产品 ,涉及到并发 所以需要同步synchronized
public synchronized void push(Chicken chicken) {
if (count==chickens.length){
//如果满了,通知消费者消费,生产等待
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
//如果没满,我们就要丢入产品,队列指针思想,先赋值,指针加一, 弹出:先指针减一在弹出
chickens[count]=chicken;
count++;
//通知消费者消费了
this.notify();
}
//消费者拿走产品
public synchronized Chicken pop(){
//判断能否消费
if (count==0){
//如果不能消费,等待生产者生产,消费者等待
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
//如果可以消费
count--;
// 把鸡拿出来,拿一个对象装住。
Chicken chicken=chickens[count];
//吃完了,通知生产者生产
this.notify();
return chicken;
}
}