黑马程序员_银行调度系统分析学习日记

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

这个项目还真是好理解 想一下我们每一个人都去过银行 取号码 等待叫号 开始服务每一次每一次想到去银行办理什么业务都会很郁闷 因为每一次取的号码和服务号码相差近50个 唉 
项目写了三遍 因为白天要上课 晚上回来才有时间写项目所以时间拖的很久
下面开始讲解写的代码
第一个类 NumberManager的代码:-->负责模拟号码的生成
/*
 * 该类是一个生成号码的基本类 最底层的类
 */
public class NumberManager {
	
	private int lastNumber = 1;
	//定义集合的 目的为了存储自动生成的每一个号码
	private List<Integer> queueNumber = new ArrayList<Integer>();
	//该方法是自动生成为了后期三种服务对象而添加的同步关键字
	public synchronized Integer generation() {
		queueNumber.add(++lastNumber);
		return lastNumber;
	}
	//该方法是为了把存进集合中的号码请前往后的一个一个取出来毕竟取得号码和服务号码不是一回事
	public synchronized Integer fetchNumber(){
		if(this.queueNumber.size()>0){
			return queueNumber.remove(0);
		}else{
			return null;
		}
	}
}
------------------------------------------------------
第二个类NumberMachine 的代码:-->负责创建每一种服务客户的自己专有的号码
/*
 * 创建三个服务对象 普通服务对象 快速服务对象 和VIP服务对象
 */
public class NumberMachine {
	//创建单例模式的目的:想一下在银行有几个取号专柜 三个对象操纵的是一个取号机目的很明显
	private NumberMachine(){};
	private static NumberMachine numberMachine=new NumberMachine();
	public static NumberMachine getInstance(){
		return numberMachine;
	}
	
	
	private NumberManager CommonServoce=new NumberManager();//普通对象
	private NumberManager ExpressServoce=new NumberManager();//快速对象
	private NumberManager VIPServoce=new NumberManager();//VIP
	//同时只设置他们的get方法是因为不能为每一个对象设置他们自己的号码那样不就乱套了吗
	public NumberManager getCommonServoce() {
		return CommonServoce;
	}
	public NumberManager getExpressServoce() {
		return ExpressServoce;
	}
	public NumberManager getVIPServoce() {
		return VIPServoce;
	}
	
}
----------------------------------------------------------
第三个类Servicewindow的创建是为了模拟从第一个窗口到第六个窗口的工作情况核心代码
/*
 * 这个是核心类每一个服务窗口为对应的服务对象服务如果没有当前对象那么就去服务其他对象
 */
public class ServiceWindow {
	//默认每一个服务窗口都是普通服务窗口毕竟只有普通用户的人数最多比例达 普通:快速:VIP=6:2:1
	private CustomerType type = CustomerType.COMMON;
	private int number = 1;// 窗口的序号
	//除了普通窗口为快速和VIP都设置应有的类型
	public CustomerType getType() {
		return type;
	}

	public void setType(CustomerType type) {
		this.type = type;
	}
	//设置当前窗口的号码从1-6
	public void setWindowId(int number) {
		this.number = number;
	}
	//核心方法-->创建一个线程 让对象类型去匹配每一个对应的服务窗口 对应有不同的操作(其实大部分操作都一样) 
	public void start() {
		Executors.newSingleThreadExecutor().execute(new Runnable() {
			@Override
			public void run() {
				while (true) {
					switch (type) {
					//如果是普通类型
					case COMMON:
						CommonService();
						break;
						//如果是快速类型
					case EXPRESS:
						ExpressService();
						break;
						//如果是VIP类型
					case VIP:
						VIPService();
						break;
					}
				}
			}

			
		});
	}
	//来的客户是普通类型
	private synchronized void CommonService() {
		//打印出哪个什么类型窗口的当前状态
		String windowName = "第" + number + "号" + type + "窗口";
		System.out.println(windowName + "开始获取普通服务");
		//让普通对象去获取号码
		Integer ServiceNumber = NumberMachine.getInstance()
				.getCommonServoce().fetchNumber();
		if (ServiceNumber != null) {
			//当普通用户拿到号码之后当前状态为没有获取到任务的窗口或者已经工作完的窗口开始为当前普通对象服务
			System.out.println(windowName+"开始为"+number+"号普通客户服务");
			//因为是普通客户所以等待的时间最长了从1-10秒不等
			int msxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			int serviceTime=new Random().nextInt(msxRandom)+1+Constants.MIN_SERVICE_TIME;
			try {
				//这里沉睡1-10秒模拟服务时间
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//现在当前窗口为当前对象服务完毕并且打印出服务时间
			System.out.println(windowName+"完成对"+ServiceNumber+"号普通客户的服务总共耗时"+(serviceTime/1000)+"秒");
		}else{
			//如果当前对象去当前窗口服务时发现窗口正在为其他用户服务只能等待一秒并打印信息
			System.out.println(windowName+"没有取到普通服务正在空闲一秒");
			try {
				Thread.sleep(1000);//等待一秒
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	private synchronized void ExpressService() {
		//该窗口得到是快速服务对象其实和普通对象的服务方法一样唯一不同的是服务时间快慢
		String windowName = "第" + number + "号" + type + "窗口";
		System.out.println(windowName + "开始获取快速任务");
		Integer ServiceNumber = NumberMachine.getInstance()
				.getExpressServoce().fetchNumber();
		if (ServiceNumber != null) {
			System.out.println(windowName+"开始为"+number+"号快速客户服务");
			//这里的服务时间是最小值1秒因为快速嘛 
			int serviceTime=Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(windowName+"完成对"+ServiceNumber+"号快速客户的服务总共耗时"+(serviceTime/1000)+"秒");
		}else{
			System.out.println(windowName+"没有取到快速任务正在空闲一秒");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			CommonService();
		}
	}
	
	private synchronized void VIPService() {
		//VIP对象的服务方法和普通服务方法一样
		String windowName = "第" + number + "号" + type + "窗口";
		System.out.println(windowName + "开始获取VIP服务");
		Integer ServiceNumber = NumberMachine.getInstance()
				.getExpressServoce().fetchNumber();
		if (ServiceNumber != null) {
			System.out.println(windowName+"开始为"+number+"号VIP客户服务");
			int msxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			int serviceTime=new Random().nextInt(msxRandom)+1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(windowName+"完成对"+ServiceNumber+"号VIP客户的服务总共耗时"+(serviceTime/1000)+"秒");
		}else{
			System.out.println(windowName+"没有取到VIP服务正在空闲一秒");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			CommonService();
		}
	}

}
----------------------------------------------------------------------
第四个类MainClass的代码:-->生成六个窗口并且生成每一种服务对象按照比例自动生成
/*
 * 这个是核心类每一个服务窗口为对应的服务对象服务如果没有当前对象那么就去服务其他对象
 */
public class ServiceWindow {
	//默认每一个服务窗口都是普通服务窗口毕竟只有普通用户的人数最多比例达 普通:快速:VIP=6:2:1
	private CustomerType type = CustomerType.COMMON;
	private int number = 1;// 窗口的序号
	//除了普通窗口为快速和VIP都设置应有的类型
	public CustomerType getType() {
		return type;
	}

	public void setType(CustomerType type) {
		this.type = type;
	}
	//设置当前窗口的号码从1-6
	public void setWindowId(int number) {
		this.number = number;
	}
	//核心方法-->创建一个线程 让对象类型去匹配每一个对应的服务窗口 对应有不同的操作(其实大部分操作都一样) 
	public void start() {
		Executors.newSingleThreadExecutor().execute(new Runnable() {
			@Override
			public void run() {
				while (true) {
					switch (type) {
					//如果是普通类型
					case COMMON:
						CommonService();
						break;
						//如果是快速类型
					case EXPRESS:
						ExpressService();
						break;
						//如果是VIP类型
					case VIP:
						VIPService();
						break;
					}
				}
			}

			
		});
	}
	//来的客户是普通类型
	private synchronized void CommonService() {
		//打印出哪个什么类型窗口的当前状态
		String windowName = "第" + number + "号" + type + "窗口";
		System.out.println(windowName + "开始获取普通服务");
		//让普通对象去获取号码
		Integer ServiceNumber = NumberMachine.getInstance()
				.getCommonServoce().fetchNumber();
		if (ServiceNumber != null) {
			//当普通用户拿到号码之后当前状态为没有获取到任务的窗口或者已经工作完的窗口开始为当前普通对象服务
			System.out.println(windowName+"开始为"+number+"号普通客户服务");
			//因为是普通客户所以等待的时间最长了从1-10秒不等
			int msxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			int serviceTime=new Random().nextInt(msxRandom)+1+Constants.MIN_SERVICE_TIME;
			try {
				//这里沉睡1-10秒模拟服务时间
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//现在当前窗口为当前对象服务完毕并且打印出服务时间
			System.out.println(windowName+"完成对"+ServiceNumber+"号普通客户的服务总共耗时"+(serviceTime/1000)+"秒");
		}else{
			//如果当前对象去当前窗口服务时发现窗口正在为其他用户服务只能等待一秒并打印信息
			System.out.println(windowName+"没有取到普通服务正在空闲一秒");
			try {
				Thread.sleep(1000);//等待一秒
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	private synchronized void ExpressService() {
		//该窗口得到是快速服务对象其实和普通对象的服务方法一样唯一不同的是服务时间快慢
		String windowName = "第" + number + "号" + type + "窗口";
		System.out.println(windowName + "开始获取快速任务");
		Integer ServiceNumber = NumberMachine.getInstance()
				.getExpressServoce().fetchNumber();
		if (ServiceNumber != null) {
			System.out.println(windowName+"开始为"+number+"号快速客户服务");
			//这里的服务时间是最小值1秒因为快速嘛 
			int serviceTime=Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(windowName+"完成对"+ServiceNumber+"号快速客户的服务总共耗时"+(serviceTime/1000)+"秒");
		}else{
			System.out.println(windowName+"没有取到快速任务正在空闲一秒");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			CommonService();
		}
	}
	
	private synchronized void VIPService() {
		//VIP对象的服务方法和普通服务方法一样
		String windowName = "第" + number + "号" + type + "窗口";
		System.out.println(windowName + "开始获取VIP服务");
		Integer ServiceNumber = NumberMachine.getInstance()
				.getExpressServoce().fetchNumber();
		if (ServiceNumber != null) {
			System.out.println(windowName+"开始为"+number+"号VIP客户服务");
			int msxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			int serviceTime=new Random().nextInt(msxRandom)+1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(windowName+"完成对"+ServiceNumber+"号VIP客户的服务总共耗时"+(serviceTime/1000)+"秒");
		}else{
			System.out.println(windowName+"没有取到VIP服务正在空闲一秒");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			CommonService();
		}
	}

}
---------------------------------------------------------------------------
第一遍写的时候看视频上敲的有的地方真很不理解 但是在写第二遍的时候返现有点规律的 这时候就肯定要写第三遍了
 


 

                                ---------------------- android培训java培训、期待与您交流! ---------------------- 详细请查看: http://edu.csdn.net/heima
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值