`
bingzhen66
  • 浏览: 36696 次
文章分类
社区版块
存档分类
最新评论

66.黑马程序员-银行业务调度系统

 
阅读更多

------- android培训java培训、期待与您交流! ----------

  1. 首先分析这个系统的需求
  2. 这里面有哪些对象呢?
  • 分析对象前先分析有哪些对象:窗口、客户。
  • 但是这两个对象是无法调度的,不同客户怎么分配窗口?客户之间先后顺序?
  • 这里少了一个隐含的关键对象:取号机,就是银行打印号码的那种。
  • 客户按说也是一个对象,但是,这里客户只是由多线程异步产生的号码资源而已。
  • 这样两个主要对象: 窗口、取号机分析出来了。
4.流程分析
  • 那么银行业务是一个什么流程?我们想象一下:
  • 1、窗口类,
    • 普通窗口去跟取号机要号,如果没要到,那么等一会再要。
    • 快速和VIP比较空闲,那么没取到自己专属的客户,也可以帮帮普通窗口。
    • 等窗口服务完后,告诉取号机。
    • 窗口需要提供的方法:
      • 创建三种窗口对象。
      • 窗口开启,开始运行。
    • package cn.itcast.bank;
      
      import java.util.Random;
      import java.util.concurrent.Executors;
      
      public class ServiceWindow
      {
      	//初始化值
      	private CustomerType type =CustomerType.COMMON;
      	private int windowId =1;	
      	
      	public void setType(CustomerType type)//设置客户类型
      	{
      		this.type = type;
      	}
      	public void setWindowId(int windowId)//设置窗口号WindowId
      	{
      		this.windowId = windowId;
      	}
      
      	public void start()//窗口开始服务,
      	{
      
      		
      		Executors.newSingleThreadExecutor().execute(new Runnable(){
      			public void run()
      			{
      				while (true)
      				{
      					switch (type) //type是窗口类型
      					{
      					case COMMON:
      						commonServies();
      						break;
      					case EXPRESS:	
      						expressServies();
      						break;
      					case VIP:
      						vipServies();
      						break;
      					}
      					
      					
      				}
      			}
      		});
      	}
      	private void commonServies()
      	{
      		String windowName = "第"+windowId+"号"+type+"窗口";
      		System.out.println(windowName + "开始获取普通任务!");
      		Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
      		
      		if(number != null)
      		{
      			System.out.println(windowName+"开始为第"+number+"号普通客户服务!");//如果取到了普通客户号。
      			//long beginTime =  System.currentTimeMillis();
      			int maxRand = Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;
      			long serviceTime = new Random().nextInt(maxRand)+1+Constans.MIN_SERVICE_TIME;//���ֵ���1-10��
      			try
      			{
      				Thread.sleep(serviceTime);
      			} catch (InterruptedException e)
      			{
      				// TODO Auto-generated catch block
      				e.printStackTrace();
      			}
      			//long costTime = System.currentTimeMillis()-beginTime;
      			System.out.println(windowName+"完成为第"+number+"号"+type+"客户服务,总耗时"+(serviceTime/1000)+"秒");
      		}
      		else
      			System.out.println(windowName+"没有取到普通任务,休息一秒");			
      			try
      			{
      				Thread.sleep(1000);
      			} catch (Exception e)
      			{
      				// TODO: handle exception
      			}
      	}
      	private void expressServies()
      	{
      		String windowName = "第"+windowId+"号"+type+"窗口";
      		System.out.println(windowName + "开始获取快速任务!");
      		Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
      	
      		if(number != null)
      		{
      			System.out.println(windowName+"开始为第"+number+"号快速客户服务!");//如果取到了普通客户号。			
      			//long beginTime =  System.currentTimeMillis();
      //			int maxRand = Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;
      
      			int serviceTime = Constans.MIN_SERVICE_TIME;			
      			try
      			{
      				Thread.sleep(serviceTime);//快速客户消耗时间为最小。
      			} catch (InterruptedException e)
      			{
      				// TODO Auto-generated catch block
      				e.printStackTrace();
      			}
      			//long costTime = System.currentTimeMillis()-beginTime;
      			System.out.println(windowName+"完成为第"+number+"号快速客户服务,总耗时"+(serviceTime/1000)+"秒");
      		}
      		else
      			System.out.println(windowName+"没有取到快速任务!");
      			commonServies();
      	}	
      	private void vipServies()
      	{
      		Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
      		String windowName = "第"+windowId+"号"+type+"窗口";
      		if(number != null)
      		{
      			System.out.println(windowName+"开始获取VIP服务!");			
      			//long beginTime =  System.currentTimeMillis();
      			int maxRand = Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;
      			long serviceTime = new Random().nextInt(maxRand)+1+Constans.MIN_SERVICE_TIME;//
      			try
      			{
      				Thread.sleep(serviceTime);
      			} catch (InterruptedException e)
      			{
      				// TODO Auto-generated catch block
      				e.printStackTrace();
      			}
      			//long costTime = System.currentTimeMillis()-beginTime;
      			System.out.println(windowName+"完成为第"+number+"号VIP客户服务,耗时"+(serviceTime/1000)+"秒");
      		}
      		else
      			System.out.println(windowName+"没有取到VIP任务!");
      			commonServies();
      	}
      }
      

  • 2、客户
    • 客户进门,去取号机取号,取到号码,就等待窗口叫号。
    • 客户分三种:普通、快速、VIP。
    • 取号机生成号,窗口取出号,服务结束。这里看出客户属于被操作的资源。
  • 3、取号机类
    • 取号机,只有一台。
    • 但是有三种客户类型,需要三种排序,每种客户有自己的操作方式相对独立,取号机就需要三个对象分别操作这三种客户类型。
    • 取号机需要提供的方法:
      • 创建取号机:单例,取号机只有一个。
      • 生成三个号码管理对象。
    • package cn.itcast.bank;
      
      public class NumberMachine
      {
      	//单例的号码机,只有一个。
      	private NumberMachine()	{}//私有的构造方法
      	private static NumberMachine instance = new NumberMachine();//私有的实例对象
      	public static NumberMachine getInstance()//给外部返回一个实例
      	{
      		return instance;
      	}
      	//私有的三个号码管理器,只能通过get获取,get前先要获得号码机的实例。
      	private NumberManager commonManager = new NumberManager();
      	private NumberManager expressManager = new NumberManager();
      	private NumberManager vipManager = new NumberManager();
      	public NumberManager getCommonManager()
      	{
      		return commonManager;
      	}
      	public NumberManager getExpressManager()
      	{
      		return expressManager;
      	}
      	public NumberManager getVipManager()
      	{
      		return vipManager;
      	}
      	
      
      
      	
      	
      
      }
      

  • 4,、号码管理器类
    • 号码管理器由取号机生成。一共有三个。
    • 三个号码管理器对应三种用户类型。
    • 号码管理器提供的方法:
      • 生成号码
      • 取出号码
    • package cn.itcast.bank;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class NumberManager
      {
      	//把号码存入集合中,每取出一个,remove一个。	
      	private int lastNumber=0;
      	private List<Integer> queueNumberList = new ArrayList<Integer>();
      	
      	//下面两个方法同步操作集合。
      	public synchronized Integer generateNewManager()
      	{
      		queueNumberList.add(lastNumber);
      		return ++lastNumber; 
      	}
      	
      	public synchronized Integer fetchServiceNumber()
      	{
      		//remove会返回删除的结果。
      		Integer number = null;
      		if(queueNumberList.size()>0)
      		{
      			number = queueNumberList.remove(0);	
      		}
      		return number;			
      	}
      }
      

  • 5、MainClass
    • 包含main()方法,开启这个程序。
    • 开启过程:
      • 建立三种窗口,调用窗口的开启方法,窗口开始运营。
      • 异步生成多种客户,每生成有一个就去取号机里取一个号。
    • package cn.itcast.bank;
      
      import java.util.concurrent.Executors;
      import java.util.concurrent.TimeUnit;
      
      public class MainClass
      {
      
      	/**
      	 * @param args
      	 */
      	public static void main(String[] args)
      	{
      		
      		for (int i = 1; i <5; i++)
      		{
      			//ServiceWindow commonWindow = null;
      			ServiceWindow Window =new ServiceWindow();
      			Window.setWindowId(i);
      			Window.start();			
      		}
      		
      		ServiceWindow expressWindow = new ServiceWindow();
      		expressWindow.setType(CustomerType.EXPRESS);
      		expressWindow.start();
      		
      		ServiceWindow vipWindow = new ServiceWindow();
      		vipWindow.setType(CustomerType.VIP);
      		vipWindow.start();
      		//普通客户拿号
      		Executors.newScheduledThreadPool(1).scheduleAtFixedRate //
      		(
      			new Runnable(){
      
      				@Override
      				public void run()
      				{
      					// TODO Auto-generated method stub
      					Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewManager();
      					System.out.println("第"+serviceNumber+"号普通客户正在等待服务!");
      				}
      				
      			}, 
      			0,
      			Constans.COMMON_CUSTOMER_INTERVAL_TIME, //
      			TimeUnit.SECONDS //
      		);
      		
      		Executors.newScheduledThreadPool(1).scheduleAtFixedRate
      		(
      			new Runnable()
      			{
      				@Override
      				public void run()
      				{
      					// TODO Auto-generated method stub
      					Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewManager();
      					System.out.println("第"+serviceNumber+"号快速客户正在等待服务!");					
      				}
      				
      			}, 
      			0,
      			Constans.COMMON_CUSTOMER_INTERVAL_TIME*2, 
      			TimeUnit.SECONDS
      		);
      		
      		Executors.newScheduledThreadPool(1).scheduleAtFixedRate
      		(
      			new Runnable(){
      
      				@Override
      				public void run()
      				{
      					// TODO Auto-generated method stub
      					Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewManager();
      					System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");					
      				}
      				
      			}, 
      			0,
      			Constans.COMMON_CUSTOMER_INTERVAL_TIME*6, 
      			TimeUnit.SECONDS
      		);
      
      	}
      
      }
      

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics