java多線程之生產者消費者問題

問題描述:生產者生產一個產品然後放入緩衝區,消費者從緩衝區拿一個產品出來,生產一個消費一個。
一開始接觸這個問題時,參考網上的教程自己寫了一個簡單的代碼:

   class  Test{//測試類
      public static void main(String[] args){
         Producer producer = new Producer();
         Consumer consumer = new Consumer();
         producer.start();
         consumer.start();
      }
  }
 class Buffer{//緩衝區類
      private production = 0;
      private boolean avilible = false;
      public synchronized void put(int value){//設置線程鎖,保證生產產品的時候,消費者不會消費
           while(avilible == true){
              try{
                   wait();
              }catch(Exception e){
             }
           }//close while
        production = value;
        avilible = true;
        notifyAll();
    }//close put()
 public synchronized int get(){
     while(avilible == false){
        try{
            wait();
          }catch(Exception e){
        }//close catch
    }//close while
    avilible = false;
    notifyAll();
     return production;
    }//close get()
}//close class buffer
 
class Producer extends Thread{
    Buffer buffer  = new Buffer();
@Override
public void run(){
    for(int i=0;i<10;i++){
    buffer.put(i);
    System.out.println("生產產品:"+i);
     try{
     sleep(50);
     }catch(Exception e){}
   }
   }//close run()
  }
class Consumer extends Thread{
   Buffer buffer = new Buffer();
   @Override
   public void run(){
       for(int i=0;i<10;i++){
       int production = buffer.get();
       System.out.println("消費產品:"+production);
       }
     }//close run()
   }    

按理來說是沒有問題,結果運行的結果一直就是:

   生產了產品 0

最後才發現有處邏輯不對,問題在於我在每個線程中都創建了一個buffer對象,這導致消費者和生產者用的不是用一個緩衝區,這個問題也是出現的很搞笑。改正代碼就是讓生產者消費者共用一個buffer對象。更改後的運行結果:

生產了產品:0
消費了產品:0
生產了產品:1
消費了產品:1
消費了產品:2
生產了產品:2
生產了產品:3
消費了產品:3
消費了產品:4
生產了產品:4
生產了產品:5
消費了產品:5
生產了產品:6
消費了產品:6
生產了產品:7
消費了產品:7
生產了產品:8
消費了產品:8
生產了產品:9
消費了產品:9

由於打印的地方沒有加鎖,所以也會有競態的出現。以上的來源於本人的愚解。有問題或者不對的地方,歡迎大家留言交流。

以上代碼參考:https://www.runoob.com/html/thread-procon.html

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