生產者與消費者用管程實現

也不算自己寫的吧,我是看過《現代操作系統》然後將其中的代碼進行完善。



public class ProcessAndConsumer {
    /**
     * @param args
     */
    static final int N =100;
    static Producer p= new Producer();
    static Consumer c= new Consumer();
    static Our_monitor mon = new Our_monitor();
      
    public static void main(String[] args) {
        // TODO Auto-generated method stub 
            p.start();
            c.start();
    }
    //生產者生產商品線程
    static class Producer extends Thread{
        public void run(){
            int item;
            while(true){
                item=producer_item();
                mon.insert(item);
            }
        }
        private int producer_item(){
            int item;
              
            item=(int)(Math.random()*100+1);
            System.out.println("生產者生產了產品:"+item);
            return item;
        }
    }
    //消費者消費線程
    static class Consumer extends Thread{
        public void run(){
            int item;
            while(true){
                item=mon.remove();
                consumer_item(item);
            }
        }
        private void consumer_item(int item){
          int i=0;
          //判斷緩衝區中是否有這個商品(因爲商品都用編號區分)然後置爲0,表示沒有商品
          for(i=0;i<N;i++)
              if(item == mon.buffer[i]){
                  mon.buffer[i]=0;
                  System.out.println("消費者消費了產品"+item); //這裏標明如果是說消費產品是0的話表示原來那個buffer位置是沒有產品的
                  break;
              }
        }
    }
    //管程實現線程
    static class Our_monitor{
        private int buffer[] =new int[N];
        private int count =0,lo=0,hi=0;
              
        public synchronized void insert(int val){
            if(count == N)
                go_to_sleep();
            buffer[hi]=val;
                  
            hi=(hi+1)%N;
            count=count+1;
            if(count == 1)
                notify();
        }
          
        public synchronized int remove(){
            int val;
            if(count ==0 )
                go_to_sleep();
                  
            val=buffer[lo];
            lo=(lo+1)%N;
              
            count=count-1;
            if(count == N-1)
                notify();
            return val;
        }
        private void go_to_sleep(){
            try {
                wait();
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
            }
        }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章