美文网首页
生产消费者模式

生产消费者模式

作者: 叫我小码哥 | 来源:发表于2018-04-21 20:37 被阅读0次

    java实现

    /*
    *   生产消费者模式
    */
    
    //该类表示的是生产的物品面包
    class Bread{
        //当前面包的一个标号
        private int Id;
        //使用构造方法赋值
        public Bread(int Id){
            this.Id = Id;
        }
        //当前面包的详细信息
        public String toString(){
            return "这是第"+Id+"个面包";
        }
    }
    
    //表示生产的面包的物品
    class myStack{
        //将面包放到数组中
        private Bread[] arr = new Bread[10];
        //当前所放面包的一个指针表示当前的位置
        private int index = 0;
    
        //生产面包
        public synchronized void push(Bread bread){
            //当生产的面包超出生产工具时,让该线程释放锁处于等待的一个状态
            if(index == arr.length){
                try{
                    this.wait();
                }catch(Exception e){
                    System.out.println("超出生产范围");
                }
            }
            //唤醒正在等待的线程
            this.notify();
            //将生产的面包放到数组中
            arr[index] = bread;
            //将当前的指针移动到下一个位置
            index++;
    
            try{
                Thread.sleep(1000);
                System.out.println("生产了"+bread);
            }catch(Exception e){
                System.out.println("中断异常");
            }
        }
        
        //消费面包
        public synchronized Bread pop(){
            //当数组中没有面包时,让该线程处于等待状态,并且释放锁
            if(index==0){
                try{
                    this.wait();
                }catch(Exception e){
                    System.out.println("超出生产范围");
                }
            }
            //唤醒真在等待的线程
            this.notify();
            //将当前指针的位置移动到上一个
            index--;
            try{
                Thread.sleep(1000);
                System.out.println("消费了"+arr[index]);
            }catch(Exception e){
                System.out.println("中断异常");
            }
            //显示当前的面包
            return arr[index];
        }
    }
    
    //生产者
    class Producer implements Runnable{
        private myStack mystack = null;
        public Producer(myStack mystack){
            this.mystack = mystack;
        }
        //生产者生产20个面包
        public void run(){
            for(int i=1;i<20;i++){
                Bread bread = new Bread(i);
                mystack.push(bread);
            }
        }
    }
    
    //消费者
    class Consumer implements Runnable{
        private myStack mystack = null;
        public Consumer(myStack mystack){
            this.mystack = mystack;
        }
        //消费者消费20个面包
        public void run(){
            for(int i=0;i<20;i++){
                mystack.pop();
            }
        }
    }
    //测试类
    public class Demo{
        public static void main(String[] args){
            myStack stack = new myStack();
            Producer producer = new Producer(stack);
            Consumer consumer = new Consumer(stack);
            new Thread(producer).start();
            new Thread(consumer).start();
        }
    }
    

    相关文章

      网友评论

          本文标题:生产消费者模式

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