生产者消费者问题

生产者消费者问题

1.管程法

测试代码如下:

//测试:生产者消费者模型-->利用缓冲区解决:管程法
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;
    public Productor(SynContainer synContainer){
     
        this.synContainer = synContainer;
    }
    //生产
    @Override
    public void run() {
     
        for (int i = 1; i <= 15; i++) {
     
            synContainer.push(new Chicken(i));
            System.out.println("生产了"+i+"只鸡");
        }
    }
}
//消费者
class Consumer extends Thread{
     
    SynContainer synContainer;
    public Consumer(SynContainer synContainer){
     
        this.synContainer = synContainer;
    }
    //消费
    @Override
    public void run() {
     
        for (int i = 1; i <= 15; 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;
    //生产者放入产品
    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];
        //通知生产者生产
        this.notifyAll();
        return chicken;
    }
}

运行结果如下:

生产了1只鸡
生产了2只鸡
生产了3只鸡
生产了4只鸡
生产了5只鸡
生产了6只鸡
生产了7只鸡
生产了8只鸡
生产了9只鸡
生产了10只鸡
消费了第10只鸡
生产了11只鸡
消费了第11只鸡
生产了12只鸡
消费了第12只鸡
生产了13只鸡
消费了第13只鸡
生产了14只鸡
消费了第14只鸡
生产了15只鸡
消费了第15只鸡
消费了第9只鸡
消费了第8只鸡
消费了第7只鸡
消费了第6只鸡
消费了第5只鸡
消费了第4只鸡
消费了第3只鸡
消费了第2只鸡
消费了第1只鸡

进程已结束,退出代码 0

2.信号灯法

测试代码如下:

//测试:生产者消费者模型2-->信号灯法,标志位解决
public class TestPC2 {
     
    public static void main(String[] args) {
     
        TV tv = new TV();
        new Player(tv).start();
        new Watcher(tv).start();
    }
}
//生产者-->演员
class Player extends Thread{
     
    TV tv;
    public Player(TV tv){
     
        this.tv = tv;
    }

    @Override
    public void run() {
     
        for (int i = 0; i < 10; i++) {
     
            if(i%2==0){
     
                this.tv.play("快乐大本营正在播放!");
            }else{
     
                this.tv.play("抖音:记录美好生活!");
            }
        }
    }
}
//消费者-->观众
class Watcher extends Thread{
     
    TV tv;
    public Watcher(TV tv){
     
        this.tv = tv;
    }

    @Override
    public void run() {
     
        for (int i = 0; i < 10; i++) {
     
            this.tv.watch();
        }
    }
}
//产品-->节目
class TV{
     
    //演员表演,观众等待  T
    //观众观看,演员等待  F
    String voice;//表演节目
    boolean flag = true;
    //表演
    public synchronized void play(String voice){
     
        if(!flag){
     
            try {
     
                this.wait();
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }
        }
        System.out.println("演员表演了"+voice);
        //通知观众观看
        this.notifyAll();
        this.voice = voice;
        this.flag = !this.flag;
    }
    public synchronized void watch(){
     
        if(flag){
     
            try {
     
                this.wait();
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }
        }
        System.out.println("观众观看了"+voice);
        //通知演员表演
        this.notifyAll();
        this.flag = !this.flag;
    }
}

运行结果如下:

演员表演了快乐大本营正在播放!
观众观看了快乐大本营正在播放!
演员表演了抖音:记录美好生活!
观众观看了抖音:记录美好生活!
演员表演了快乐大本营正在播放!
观众观看了快乐大本营正在播放!
演员表演了抖音:记录美好生活!
观众观看了抖音:记录美好生活!
演员表演了快乐大本营正在播放!
观众观看了快乐大本营正在播放!
演员表演了抖音:记录美好生活!
观众观看了抖音:记录美好生活!
演员表演了快乐大本营正在播放!
观众观看了快乐大本营正在播放!
演员表演了抖音:记录美好生活!
观众观看了抖音:记录美好生活!
演员表演了快乐大本营正在播放!
观众观看了快乐大本营正在播放!
演员表演了抖音:记录美好生活!
观众观看了抖音:记录美好生活!

进程已结束,退出代码 0

你可能感兴趣的:(Java,java)