基于java多线程方式的生产者消费者模式实现

第一种实现:
//这种实现有一个问题,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();
				}
				
			}
		
		
	}
}


猜你喜欢

转载自chen-sai-201607223902.iteye.com/blog/2372826