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

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