JAVA线程同步生产者/消费者简单例子

来源:互联网 发布:windows编程入门书籍 编辑:程序博客网 时间:2024/05/18 01:41

public class TestProducerConsumer {
  public static void main(String[] args) {
     StoreRoom sr = new StoreRoom();
     Producer p1 = new Producer(sr,"制造一部");
     Producer p2 = new Producer(sr,"制造二部");
     Consumer c1 = new Consumer(sr,"销售一部");
     Consumer c2 = new Consumer(sr,"销售二部");
     Thread t1 = new Thread(p1);
     Thread t2 = new Thread(p2);
     Thread t3 = new Thread(c1);
     Thread t4 = new Thread(c2);
     t1.start(); t2.start();t3.start(); t4.start();
  }
}

class Product {
  int id;
  String producedBy;
  String consumedBy;
   Product(int id,String producedBy) {
    this.id = id;
    this.producedBy = producedBy;
  }
  public void consume(String consumedBy) {
    this.consumedBy = consumedBy;
  }
  public String toString() {
    return "该产品的,生产部门是:" + producedBy +",销售部门是:" + consumedBy;    
  }
  public String getProducedBy() {
    return producedBy;
  }
  public String getConsumedBy() {
    return consumedBy;
  }
  public int getID() {
    return this.id;
  }      
}
 
class StoreRoom {
  Product[] pL = new Product[6];
  int index = 0;
  public synchronized void push(Product p) throws Exception {
     while(index == pL.length) {
        System.out.println(p.getProducedBy() + "仓库满了,请你歇歇稍等");
        this.wait();
     }
     pL[index] = p; 
     index ++;
     System.out.println(p.getProducedBy() + "已经生产了" + p.getID() +"个,销售部门快来取货卖");
     notifyAll();
  }     
  public synchronized Product pop(String s) throws Exception {
     while(index == 0) {
        System.out.println(s + "  仓库没货了,请你歇歇稍等");
        this.wait();
     }
     index--;
     Product product = pL[index];
     product.consume(s);
     System.out.println(s + "已经拿走了一个,制造部门赶快生产");
     notifyAll();
     return product;
  }     
  
}      

class Producer implements Runnable{
   StoreRoom sr;String s;
   Producer(StoreRoom sr,String s) {
     this.sr = sr;
     this.s = s;
   } 
   public void run() {
     int i = 0;
     while(true) {
       i++;
       Product p = new Product(i,s);
        try{
         sr.push(p);
        }
        catch(Exception e) {
        }  
     } 
   }   
}

class Consumer implements Runnable{
   StoreRoom sr;String s;
   Consumer(StoreRoom sr,String s) {
   this.sr = sr;
   this.s = s;
    } 
    public void run() {
      while(true) {
         try{
          sr.pop(s);
         }
         catch(Exception e) {
          }  
       } 
      } 
}