生产者消费者模式,解决锁的问题

2018-10-27  本文已影响0人  笑才

直接上代码

public class Test{//测试类
    public static void main(String[] args) {
        Plate plate = new Plate();//所有的线程公用的对象(盘子)
        Producer producer = new Producer(plate);
        Producer producer2 = new Producer(plate);
        Consumer consumer = new Consumer(plate);
        Thread thread01 = new Thread(producer);
        Thread thread03 = new Thread(producer2);
        Thread thread02 = new Thread(consumer);
        thread01.start();
        //thread03.start();
        thread02.start();
    }
}

class Plate {//盘子(存放包子)
    private Vector<String> steameds = new Vector<String>();//包子(Vector线程安全,如果用LinkedList,运行过程中会报错)
    static int num=0;//包子数量
    private boolean flag=false;//是否有消费者等待
    
    public void producer(String product){//生产包子
        try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}//模拟生产包子时间
        steameds.add(product);//向盘子里放包子
        num++;
        System.out.println("生产了一个包子,还剩"+num+"个包子");
        //看是否有消费者等待,有责唤醒他们
        if(flag){
            flag=false;
            System.out.println("生产了包子,通知等待的吃包子");
            synchronized(this){
                this.notifyAll();//唤醒等待中的消费者
            }
        }
    }
    
    public synchronized void consumer(){//吃掉包子
        //开始池包子
        try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}//模拟吃包子时间
        if(steameds.isEmpty()){//没有包子,则等待
            flag = true;
            System.out.println("没包子了,等待。。。。");
            try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}
        }else{//有包子则吃
            steameds.remove(0);
            num--;
            System.out.println("吃完一个包子,还剩"+num+"个包子");
        }
    }
}

class Producer implements Runnable{//生产者
    private Plate p;
    public Producer(Plate p){
        this.p = p;
    }
    public void run() {
        for(int i=1;i<100;i++){
            p.producer("包子"+i);//生产者生产包子
        }
    }
}

class Consumer implements Runnable{//消费者
    private Plate p;
    public Consumer(Plate p){
        this.p = p;
    }
    public void run() {
        for(int i=1;i<100;i++){
            p.consumer();//消费者吃包子
        }
    }
}

以上代码就是个生产者消费者模式的代码,通过标记法,标记符flag为true时,有消费者等待,生产者生产好东西后唤醒消费者消费,flag为false时,没有消费者等待,同时通过盘子里包子的数量,判断消费者是否等待。。。。。

上一篇下一篇

猜你喜欢

热点阅读