//这种实现有一个问题,produce和consume用的是同一把锁。所以生产的时候就不能消费,消费的时候不能生产. public class Storage implements StorageInterface{ private final int MAX_NUM = 100; private LinkedList<Object> lists = new LinkedList<Object>(); public void produce(int num){ synchronized (lists) { while(num+lists.size()>MAX_NUM){ try { System.out.println("暂时不能生产"+num+"个任务,当前库存为:"+lists.size()); lists.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<num;i++){ lists.add(new Object()); System.out.println("生产了"+i+"个商品,当前库存为:"+lists.size()); } lists.notifyAll(); } } public void consume(int num){ synchronized (lists) { while(lists.size()<num){ try { System.out.println("暂时不能消费"+num+"个任务,当前剩余任务数:"+lists.size()); lists.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<lists.size();i++){ lists.remove(i); System.out.println("消费了"+i+"个商品,还剩产品数:"+lists.size()); } lists.notifyAll(); } } }
第二种实现:既能消费又能生产的实现.利用BlockingQueue来实现.
public class StorageWithQueen implements StorageInterface{ private final int MAX_NUM = 100; private final BlockingQueue<Object> blockingQueue = new LinkedBlockingQueue<>(MAX_NUM); public void produce(int num) { if(blockingQueue.size()==MAX_NUM){ System.out.println("暂时不能生产"+num+"个任务,当前库存为:"+blockingQueue.size()); } for(int i=0;i<num;i++){ try { blockingQueue.put(new Object()); System.out.println("生产了"+(i+1)+"个商品,当前库存为:"+blockingQueue.size()); } catch (InterruptedException e) { e.printStackTrace(); } } } public void consume(int num){ if(blockingQueue.size()==0){ System.out.println("暂时不能消费"+num+"个任务,当前剩余任务数:"+blockingQueue.size()); } for(int i=0;i<blockingQueue.size();i++){ try { blockingQueue.take(); System.out.println("消费了"+(i+1)+"个商品,还剩产品数:"+blockingQueue.size()); } catch (InterruptedException e) { e.printStackTrace(); } } } }