也不算自己写的吧,我是看过《现代操作系统》然后将其中的代码进行完善。



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();
                }
            }
        }
    }