多生产者 多消费者

实现连续生产多个和连续消费多个。

  1 import java.util.concurrent.locks.*;
  2 //描述产品
  3 class Clothes
  4 {
  5     //产品名称
  6     private String name;
  7     //产品价格
  8     private double price;
  9     //存放产品的容器
 10     private Clothes[] arr = new Clothes[100];
 11     //创建一把锁
 12     private Lock lock = new ReentrantLock();
 13     //创建和锁绑定的Condition对象,控制生产线程
 14     private Condition pro = lock.newCondition();
 15     //创建和锁绑定的Condition对象,控制生产线程
 16     private Condition con = lock.newCondition();
 17     //生产使用的下标
 18     private int propointer;
 19     //消费使用的下标
 20     private int conpointer;
 21     //记录产品数量
 22     private int count;
 23 
 24     public Clothes(){}
 25     public Clothes(String name,double price)
 26     {
 27         this.name = name;
 28         this.price = price;
 29     }
 30 
 31     public String toString()
 32     {
 33         return name+",RMB:"+price;
 34     }
 35 
 36     //生产功能
 37     public void produce()
 38     {
 39         lock.lock();
 40         try
 41         {
 42             //先判断该不该生产,当容器满的时候不能生产
 43             while(count==arr.length)
 44             {
 45                 try
 46                 {
 47                     pro.await();
 48                 }
 49                 catch (InterruptedException e)
 50                 {
 51                     e.printStackTrace();
 52                 }
 53             }
 54             arr[propointer] = new Clothes("衬衣",99.99);
 55             System.out.println(Thread.currentThread().getName()+"...生产了..."+arr[propointer]+"..."+count);
 56             count++;
 57             if(++propointer==arr.length)
 58                 propointer = 0;
 59             con.signal();
 60         }
 61         finally
 62         {
 63             lock.unlock();
 64         }
 65     }
 66     //消费功能
 67     public void consume()
 68     {
 69         lock.lock();
 70         try
 71         {
 72             //判断该不该消费,当商品数量为0的时候不能消费
 73             while(count==0)
 74             {
 75                 try
 76                 {
 77                     con.await();
 78                 }
 79                 catch (InterruptedException e)
 80                 {
 81                     e.printStackTrace();
 82                 }
 83             }
 84             Clothes yifu = arr[conpointer];
 85             System.out.println(Thread.currentThread().getName()+"---消费了---"+yifu);
 86             count--;
 87             if(++conpointer==arr.length)
 88                 conpointer = 0;
 89             pro.signal();
 90         }
 91         finally
 92         {
 93             lock.unlock();
 94         }
 95     }
 96 }
 97 
 98 //生产任务
 99 class Producer implements Runnable
100 {
101     private Clothes clo;
102     public Producer(Clothes clo)
103     {
104         this.clo = clo;
105     }
106     public void run()
107     {
108         while(true)
109             clo.produce();
110     }
111 }
112 
113 //消费任务
114 class Consumer implements Runnable
115 {
116     private Clothes clo;
117     public Consumer(Clothes clo)
118     {
119         this.clo = clo;
120     }
121     public void run()
122     {
123         while(true)
124             clo.consume();
125     }
126 }
127 
128 
129 class Demo
130 {
131     public static void main(String[] args) 
132     {
133         Clothes clo = new Clothes();
134         Producer producer = new Producer(clo); 
135         Consumer consumer = new Consumer(clo); 
136         
137         Thread t1 = new Thread(producer);
138         Thread t2 = new Thread(producer);
139 
140         Thread t3 = new Thread(consumer);
141         Thread t4 = new Thread(consumer);
142 
143         t1.start();
144         t2.start();
145         t3.start();
146         t4.start();
147     }
148 }

 

posted @ 2016-12-06 21:11  ninan_ton  阅读(217)  评论(0)    收藏  举报