Consumer VS Producer

生产者与消费者模型中,要保证以下几点:
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

你可能感兴趣的:(SUM)