现在的位置: 首页 > 综合 > 正文

Consumer VS Producer

2013年05月30日 ⁄ 综合 ⁄ 共 1862字 ⁄ 字号 评论关闭

生产者与消费者模型中,要保证以下几点:
1 同一时间内只能有一个生产者生产
2 同一时间内只能有一个消费者消费
3 生产者生产的同时消费者不能消费
4 消息队列满时生产者不能继续生产
5 消息队列空时消费者不能继续消费

package ying.threadWait;

import java.util.Vector;

public class TestConsumer {		
	
	public static void main(String[] args) { 
		WareHouse warehouse = new WareHouse(0) ; 
		Producer pro1 = new Producer(15 , warehouse) ; 	 
		Consumer cust1 = new Consumer(30 , warehouse) ;  
		Consumer cust2 = new Consumer(20 , warehouse) ;  
		Consumer cust3 = new Consumer(15 , warehouse) ;  
			
		pro1.start() ; 		 
		cust1.start() ; 
		cust2.start() ; 
		cust3.start() ; 
		System.out.println("Bye"); 	
	}
}	

class WareHouse { 
	public int cur_size ; 
	public final static int max_size = 50 ; 
	
	public WareHouse() { 
	}
	
	public WareHouse(int size) { 
		this.cur_size = size ; 
	}	
	
	public synchronized void produce(int produceNum) { 
		while (produceNum + cur_size > max_size) { 
			System.out.println("The quantity of product to produce is " + produceNum 
									+ " which is over the remaining storage limit : " + (max_size - cur_size));
			try {	
				System.out.println("Producer " + Thread.currentThread().getName() + " waits"); 
				wait() ;
			} catch (InterruptedException e) {
						
				e.printStackTrace();
			} 	
		}			
		cur_size += produceNum ; 
		System.out.println(Thread.currentThread().getName() + " has produced " + produceNum + " pieces of product."); 
		notifyAll() ; 	
	}			
	
	public synchronized void consume(int needNum) { 
			while (needNum > cur_size) { 
				try {		
					System.out.println("Consumer " + Thread.currentThread().getName() + " waits"); 
					wait() ;
				} catch (InterruptedException e) {
								
					e.printStackTrace();
				} 
			}	
			cur_size -= needNum ; 	
			System.out.println("The customer has consumed " + needNum + " pieces of product.");	
			notifyAll() ; 
	}							
}		

class Producer extends Thread { 
	private int produceNum ; 
	private WareHouse warehouse ; 
	
	Producer(int num , WareHouse house) { 
		this.produceNum = num ;  
		this.warehouse = house ; 
	} 		
	
	public void run() { 	
		while (true) { 
			warehouse.produce(produceNum) ; 		
		} 
	}		
}	
		

class Consumer extends Thread { 
	private int needNum ; 
	private WareHouse warehouse ; 
	
	Consumer(int num , WareHouse warehouse) { 
		this.needNum = num ; 
		this.warehouse = warehouse ; 
	}		
	
	public void run() { 
		warehouse.consume(needNum) ; 
	}
}					

 有空时可以参考:http://www.blogjava.net/amigoxie/archive/2007/04/11/110006.html

抱歉!评论已关闭.