• 生产者与消费者--demo1---bai


    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    //自定义类,描述仓库
    public class StoreHouse 
    {
    	private List<String> products = new ArrayList<String>(); //仓库的所有商品的列表
    	
    	public void add(String product)
    	{		
    		this.products.add(product);
    	}
    	Random rd = new Random();
    	public String sale()  //随机从所有商品中,任取一件进行出售
    	{
    		int index = rd.nextInt(this.products.size());
    		
    		//从数组中,删除序号为index的商品。并作为返回值返回。
    		String product = this.products.remove(index);
    		return product;
    	}
    	
    	//获取仓库的商品个数
    	public int getSize()
    	{
    		return  this.products.size();
    	}
    }
    

      

    import java.util.Random;
    
    //消费者线程。不断的消费
    public class ConsumeThread extends  Thread
    {
    	private StoreHouse house;//持有1个仓库
    	
    	//构造函数中,传入仓库对象
    	public ConsumeThread(StoreHouse house) 
    	{
    		this.house = house;
    	} 
    	
    	@Override
    	public void run() {
    		Random rd = new Random();
    		while(true)
    		{
    			synchronized (house) 
    			{
    				if(house.getSize()==0)
    				{
    					System.out.println("仓库为空,消费者开始等待...");
    					//如果仓库为空,则本消费者线程进入等待状态。会释放同步锁。
    					try {
    						house.wait(); //释放同步锁,其他线程可以继续执行。
    						//Thread.sleep(3000);//不释放同步锁。所以其他线程无法继续执行。
    						//house.wait();
    					} catch (InterruptedException e) {
    						
    						e.printStackTrace();
    					}
    				}
    			}
    			
    			synchronized (house)
    			{
    				if (house.getSize() > 0) //只要仓库的库存大于0
    				{
    					String product = house.sale();
    					System.out.println("消费者从仓库中取走了 " + product);
    				}
    			}
    			try {
    				Thread.sleep(rd.nextInt(2000));
    			} catch (InterruptedException e) {
    				
    				e.printStackTrace();
    			} //随机休息2秒以内的时间
    		}
    	}
    
    }
    

      

    import java.util.Random;
    
    //生产者线程。不断的往仓库添加商品
    
    public class ProduceThread  extends  Thread
    {
    	private StoreHouse house;//持有1个仓库
    	
    	//构造函数中,传入仓库对象
    	public ProduceThread(StoreHouse house) 
    	{
    		this.house = house;
    	}
    	
    	
    	@Override
    	public void run() 
    	{
    		Random rd = new Random();
    		//不断的往仓库添加商品
    		while(true)
    		{
    			synchronized (house) 
    			{
    				//随机产生1个商品名
    				String product = "商品" + rd.nextInt(200);
    				//将该商品添加到仓库
    				house.add(product);
    				house.notifyAll();//通知所有其他处于wait状态的线程继续执行
    				System.out.println("生产者将 " + product + " 添加到仓库中");
    			}
    			try {
    				Thread.sleep(rd.nextInt(2000));
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} //随机休息2秒以内的时间
    		}
    	}
    	
    }
    

      

    public class Test 
    {
    	public static void main(String[] args) 
    	{
    		//1 创建1个仓库对象,作为共享数据
    		StoreHouse house = new StoreHouse();
    		//2 创建生产者线程
    		ProduceThread pt = new ProduceThread(house);
    		
    		//3 创建消费者线程
    		ConsumeThread ct1 = new ConsumeThread(house);		
    		ConsumeThread ct2 = new ConsumeThread(house);
    		//4 启动线程
    		pt.start();
    		ct1.start();
    		ct2.start();
    		
    	}
    }
    

      

  • 相关阅读:
    用C#生成足够随机的互不相同的随机数
    CRM
    Asp.net2.0部署时TreeView控件无法正常显示没有图片的问题
    javascript解析json
    jQuery插件倒计时。
    ASP.NET MVC + jQuery + Newtonsoft.Json 快乐的AJAX
    .NET中DataSet转化Json工具类
    jQuery load html
    jQuery 使用注意点技巧1
    WEB页面多语言支持解决方案
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6268894.html
Copyright © 2020-2023  润新知