美文网首页
生产者消费者模式,解决锁的问题

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

作者: 笑才 | 来源:发表于2018-10-27 01:49 被阅读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时,没有消费者等待,同时通过盘子里包子的数量,判断消费者是否等待。。。。。

    相关文章

      网友评论

          本文标题:生产者消费者模式,解决锁的问题

          本文链接:https://www.haomeiwen.com/subject/fdyrtqtx.html