zoukankan      html  css  js  c++  java
  • 利用线程间的通讯实现的水池加水放水

    业务需求,加水速度5L/s,放水速度2L/s,加水时不能放水,放水时不能加水,水池容量500L

    class Pool{
    	
    	int volume = 0;
    	int maxVolume = 500;
    	int waterInSpeed = 5;
    	int waterOutSpeed = 2;
    	boolean flag = false;
    	
    }
    
    class WaterIn extends Thread{
    	
    	Pool pool = new Pool();
    	
    	int temp = 0;
    	//构造器
    	public WaterIn(Pool pool) {
    		this.pool = pool;
    	}
    	@Override
    	public void run(){
    		while(true){
    			synchronized (pool) {
    			  if(!pool.flag){
    				  try {
    					  Thread.sleep(10);
    				  } catch (InterruptedException e) {
    					  // TODO Auto-generated catch block
    					  e.printStackTrace();
    				  }
    				  if(pool.volume < pool.maxVolume){
    					  pool.volume += pool.waterInSpeed;
    					  if(temp++%10 == 0){
    						  System.out.println("水池加水到:"+pool.volume);
    						  
    					  }
    				  }
    				  else{
    					  System.out.println("水已经满了"+pool.volume);
    					  pool.flag = true;
    					  pool.notify();
    				  }
    			    }else{
    					try {
    						pool.wait();
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    			}
    		}
    	}
    }
    class WaterOut extends Thread{
    	
    	Pool pool = new Pool();
    	int temp;
    	//构造器
    	public WaterOut(Pool pool) {
    		this.pool = pool;
    	}
    	@Override
    	public void run(){
    		  while(true){
    			  synchronized(pool){
    				  //进行标识判断
    				  if(pool.flag){
    					  if(pool.volume>0){
    						  pool.volume -=pool.waterOutSpeed;
    						  if(temp++%20 == 0)
    							  System.out.println("水已经放到"+pool.volume);
    						  
    					  }else{
    						  System.out.println("水已经放完了"+pool.volume);
    						  pool.flag = false;
    						  pool.notify();
    					  }
    				  }else{
    					  try {
    						pool.wait();
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				  }
    			  }
    		  }
    	}
    

      

    Pool pool =new Pool();
    		WaterIn in =new WaterIn(pool);
    		WaterOut out = new WaterOut(pool);
    		in.start();
    		out.start();
    

      

  • 相关阅读:
    Spring Security -- 添加图形验证码(转载)
    Spring Security -- 自定义用户认证(转载)
    pandas agg 后降低df表层
    判断是否有人跟踪车辆的方案
    格隆汇笔记-黄勇演讲
    Mac mysql 忘记root密码的解决方法
    sql 同步2个表中的一个字段数据
    Linux下配置用msmtp和mutt发邮件
    spark StructType的应用,用在处理mongoDB keyvalue
    Idea2018旗舰版破解方法
  • 原文地址:https://www.cnblogs.com/it-life-nathan/p/6914002.html
Copyright © 2011-2022 走看看