生产者/消费者问题_2
class Storage2{ private final int MAX_SIZE = 100; private List<Object> list = new LinkedList<Object>(); private Lock lock = new ReentrantLock(); private Condition full = lock.newCondition(); private Condition empty = lock.newCondition(); public void produce(int num){ lock.lock(); while(list.size() + num > MAX_SIZE){ System.out.println("线程:" + Thread.currentThread().getId() + " --> " + "需要生产的产品:" + num + ",库存:" + list.size() + "暂时无法执行生产任务."); try { full.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i=0; i<num; i++){ list.add(new Object()); } System.out.println("线程:" + Thread.currentThread().getId() + " --> " + "已生产产品数:" + num + ",库存:" + list.size()); full.signalAll(); empty.signalAll(); lock.unlock(); } public void consume(int num){ lock.lock(); while(list.size() < num){ System.out.println("线程:" + Thread.currentThread().getId() + " --> " + "需要消费产品:" + num + ",库存:" + list.size() + "暂时无法提供消费服务."); try { empty.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i=0; i<num; i++) list.remove(0); System.out.println("线程:" + Thread.currentThread().getId() + " --> " + "消费:" + num + ",库存:" + list.size()); empty.signalAll(); full.signalAll(); lock.unlock(); } public List<Object> getList() { return list; } public void setList(List<Object> list) { this.list = list; } public int getMAX_SIZE() { return MAX_SIZE; }}class Producer2 extends Thread{ private int num; private Storage2 storage; public Producer2(Storage2 storage) { super(); this.storage = storage; } @Override public void run() { // TODO Auto-generated method stub produce(num); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public void produce(int sum){ this.storage.produce(sum); }}class Consumer2 extends Thread{ private int num; private Storage2 storage; public Consumer2(Storage2 storage) { super(); this.storage = storage; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public void consumer(int sum){ this.storage.consume(sum); } @Override public void run() { // TODO Auto-generated method stub consumer(num); }}public class ProducerConsumerMode_2 { public static void main(String[] args){ Storage2 storage = new Storage2(); Producer2[] p = new Producer2[10]; Consumer2[] s = new Consumer2[10]; for(int i=0; i<10; i++){ int num; num = (int) (Math.random()*30); p[i] = new Producer2(storage); p[i].setNum(num); num = (int) (Math.random()*30); s[i] = new Consumer2(storage); s[i].setNum(num); } for(int i=0; i<10; i++){ p[i].start(); s[i].start(); } }