• 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

  • 相关阅读:
    编程术语英汉对照
    asp.net常用函数
    好的博客地址
    读取项目中的txt文件内容
    Web Service的定义
    ADO.NET在开发中的部分使用方法和技巧
    如何实现文本框焦点自动跳转及通过回车键提交表单
    15位和18位身份证JS校验实例
    PL/SQL 操作数据库常见脚本
    android 隐藏标题栏
  • 原文地址:https://www.cnblogs.com/diyingyun/p/2301202.html
Copyright © 2020-2023  润新知