---------------------- android培训、java培训、期待与您交流! ----------------------
需求:
1.银行内有6个业务窗口:1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
2.有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
3.异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户 = 1 :6 :3。
4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
5.各类型客户在其对应窗口按顺序依次办理业务。
6.当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
7.随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
对象分析:
1.窗口:
窗口:分三种类型,普通,vip,快速办理,用一个属性来标记他们
属性:类型,窗口号
方法:改变窗口号,改变类型办理业务
2.号码机器:
属性:类型
方法:生成号码
下面说明实例
1.用户类型:(CustomerType.java)
package com.zlc.bank;
publicenumCustomerType{
//用枚举表示出三种用户类型
COMMON,EXPRESS,VIP;
publicString toString()
{
switch(this)
{
case COMMON:return"普通";
case EXPRESS:return"快速";
case VIP:return"VIP";
}
returnnull;
}
}
2.(NumberMachine.java)
//只能在某一时刻产生一个,应使用单例模式
package com.zlc.bank;
publicclassNumberMachine{
privateNumberManager commonManager=newNumberManager();
privateNumberManager expressManager=newNumberManager();
privateNumberManager vipManager=newNumberManager();
publicNumberManager getCommonManager(){
return commonManager;
}
publicNumberManager getExpressManager(){
return expressManager;
}
publicNumberManager getVipManager(){
return vipManager;
}
privateNumberMachine()
{
}
publicstaticNumberMachine instance=newNumberMachine();
publicstaticNumberMachine getInstance()
{
return instance;
}
}
3.办理业务使用到了多线程,可以将下面的代码抽象成一个方法
String windowName ="第"+ number +"号"+ type +"窗口";
System.out.println(windowName +"开始获取"+type"任务!");
Integer serviceNumber =NumberMachine.getInstance().getCommonManager().fetchNumber();
if(serviceNumber !=null){
System.out.println(windowName +"开始为第"+ serviceNumber +"号"+type+"客户服务");
int maxRandom =Constants.MAX_SERVICE_TIME -Constants.MIN_SERVICE_TIME;
int serviceTime =newRandom().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
try{
Thread.sleep(serviceTime);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(windowName +"完成为第"+ serviceNumber +type+"通客户服务,总共耗时"+ serviceTime/1000+"秒");
}else{
System.out.println(windowName +"没有取到"+type+"任务,正在空闲一秒");
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
关于程序的原理和耦合之处:1、多线程生成一个号码就代表来了一个客户并存到一个集合之中2、开启三个多线程分别取出集合之中的数据,如果相应的的集合类型大小为0表示为没有人,如果大于0,减1,并休息(一定)随即的时间3、main方法中负责初始化窗口和开启三种类型的线程取号码,(如果,拥有cpu资源并执行)就取到号码那么就代表来人啦
---------------------- android培训、java培训、期待与您交流! ----------------------
来源:https://www.cnblogs.com/dangfei/archive/2012/03/04/2379053.html