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

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

模拟实现银行业务调度系统逻辑,具体需求如下: 

银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。

有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。

异步随机生成各种类型的客户,生成各类型用户的概率比例为:VIP客户 :普通客户 :快速客户 =  1 :6 :3。

 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。

 各类型客户在其对应窗口按顺序依次办理业务。

  当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

  随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。

  不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

类图:


下面对每个类进行详细分析:

NumberManager类
定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
NumberMachine类
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。
将NumberMachine类设计成单例。
CustomerType枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。
ServiceWindow类
定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。
定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。
MainClass类
用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。
Constants类
定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME

代码展示:

package it.heima.bank;

import java.util.ArrayList;
import java.util.List;

public class NumberManger {
	
	private  int lastNumber=1;//定义用于存储上一个客户号码的成员变量
	private  List<Integer>  queueNumbers=new ArrayList<Integer>();//存放所以等待被服务号码的队列集合。
	
	//下边两个方法(两个线程)访问了相同的数据,会出现问题,所以应该使他们互斥。synchronized
	public synchronized Integer generateNumber(){
		queueNumbers.add(lastNumber);
		return  lastNumber++;
	}
	//等待服务号码
	public synchronized Integer fetchSerivceNumber(){
		if(queueNumbers.size()>0){
			return queueNumbers.remove(0);
		}else {
			return null;
		}
		
	}

}

package it.heima.bank;

public class NumberMachine {
	/**
	 * 本类是对三个不同号码进行管理
	 */
	private  NumberManger  commconManger=new NumberManger();//普通客户号码对象
	private  NumberManger  fastManger=new NumberManger();//快速客户号码对象
	private  NumberManger  vipManger=new NumberManger();//vip客户号码对象
	public NumberManger getCommconManger() {
		return commconManger;
	}
	public NumberManger getFastManger() {
		return fastManger;
	}
	public NumberManger getVipManger() {
		return vipManger;
	}
	
	//这里要运用单例模式。
	private NumberMachine(){}
	public static NumberMachine getInstance(){
		return instance;
	}
	private static NumberMachine instance=new NumberMachine();
	

}

package it.heima.bank;

//定义枚举类,表示三个客户类型
public enum CustomerType {
  COMMON,FAST,VIP;
  public String toString(){
	  switch (this) {
	case COMMON:
		
		return "普通";

	case FAST:
		return "快速";
	case VIP:
		return name();//这个name方法,返回的就是枚举本身
	
	}
	  return null;
  }
}

package it.heima.bank;

import java.util.Random;
import java.util.concurrent.Executors;

public class WindowService {
	
	private CustomerType type=CustomerType.COMMON;
	public void setType(CustomerType type) {
		this.type = type;
	}

	public void setWidowId(int widowId) {
		this.widowId = widowId;
	}
	private int widowId=1;
	
	//服务窗口:
	public void start(){
		Executors.newSingleThreadExecutor().execute(new Runnable() {
			
			@Override
			public void run() {
		           while(true){
		        	   switch(type){
		        	   case COMMON:
						commonService();
		        		   break;
		        	   case FAST:
		        		   fastService();
		        		   break;
		        	   case VIP:
		        		  vipService();
		        		   break;
		        	   }
		           }
				
			}

	
		});
	}

		private void commonService() {
			String windowName="第"+widowId+"号"+"普通"+"窗口";
			System.out.println(windowName+"正在获取任务");
			Integer number=	NumberMachine.getInstance().getCommconManger().fetchSerivceNumber();
			if(number!=null){
				System.out.println(windowName + "开始为第" + number + "号普通客户服务");
				 long beginTime=System.currentTimeMillis();
				 int maxRand=Constants.MAX_SERVERTIME-Constants.MIN_SERVERTIME;
				 long serverTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVERTIME;
				 try {
					Thread.sleep(serverTime);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				 long costTime=System.currentTimeMillis()-beginTime;
				System.out.println(windowName+"为第"+number+"个"+"普通"+"客服服务,一共耗时:"+costTime/1000+"秒");
			}else {
				System.out.println(windowName+"没有获取到任务,就先休息1秒钟");
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}
		} 
		private void fastService() {
			String windowName="第"+widowId+"号"+type+"窗口";
			System.out.println(windowName+"正在获取任务");
			Integer number=	NumberMachine.getInstance().getFastManger().fetchSerivceNumber();
			if(number!=null){
				System.out.println(windowName + "开始为第" + number + "号普通客户服务");	
				 long beginTime=System.currentTimeMillis();
				// int maxRand=Constants.MAX_SERVERTIME-Constants.MIN_SERVERTIME;
				// long serverTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVERTIME;
				 try {
					Thread.sleep(Constants.MAX_SERVERTIME);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				 long costTime=System.currentTimeMillis()-beginTime;
				 System.out.println(windowName+"为第"+number+"个"+type+"客服服务,一共耗时:"+costTime/1000+"秒");
			}else {
				System.out.println(windowName+"没有获取到任务");
				commonService();//没有取到任务时,帮助普通窗口服务
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}
		} 
		private void vipService() {
			String windowName="第"+widowId+"号"+type+"窗口";
			System.out.println(windowName+"正在获取任务");
			Integer number=	NumberMachine.getInstance().getVipManger().fetchSerivceNumber();
			if(number!=null){
				System.out.println(windowName + "开始为第" + number + "号普通客户服务");
				 long beginTime=System.currentTimeMillis();
				 int maxRand=Constants.MAX_SERVERTIME-Constants.MIN_SERVERTIME;
				 long serverTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVERTIME;
				 try {
					Thread.sleep(serverTime);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				 long costTime=System.currentTimeMillis()-beginTime;
				 System.out.println(windowName+"为第"+number+"个"+type+"客服服务,一共耗时:"+costTime/1000+"秒");
			}else {
				System.out.println(windowName+"没有获取到任务");
				commonService();//没有取到任务时,帮助普通窗口服务
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}
		} 
}

package it.heima.bank;

public class Constants {
	
	public static int MAX_SERVERTIME=10000;
	public static int MIN_SERVERTIME=1000;
	public static int CUSTOMER_INTERUALL_TIME=1;
		
}

package it.heima.bank;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class MainClass {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		for(int i=1;i<5;i++){
			WindowService commWindow=new WindowService();
			//commWindow.setType(CustomerType.COMMON);
			commWindow.setWidowId(i);
			commWindow.start();
		}
		WindowService fastWindow=new WindowService();
		fastWindow.setType(CustomerType.FAST);
		fastWindow.start();
		
		WindowService VipWindow=new WindowService();
		VipWindow.setType(CustomerType.VIP);
		VipWindow.start();
	    //普通客户拿号	
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				
			Integer number=NumberMachine.getInstance().getCommconManger().generateNumber();
			System.out.println(number+"号,普通客户正在等待服务!");
			}
		},0,Constants.CUSTOMER_INTERUALL_TIME,TimeUnit.SECONDS);
		//快速客户拿号
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				
			Integer number=NumberMachine.getInstance().getFastManger().generateNumber();
			System.out.println(number+"号,快速客户正在等待服务!");
			}
		},0,Constants.CUSTOMER_INTERUALL_TIME*2,TimeUnit.SECONDS);
		//vip客户拿号
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				
			Integer number=NumberMachine.getInstance().getVipManger().generateNumber();
			System.out.println(number+"号,vip客户正在等待服务!");
			}
		},0,Constants.CUSTOMER_INTERUALL_TIME*6,TimeUnit.SECONDS);
		
	}
       
	
}
----------------------  android培训 , java培训 、期待与您交流! ----------------------


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值