您的位置:首页 > 职场人生

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

2013-11-23 16:25 423 查看
<a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!


银行业务调度系统

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

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

Ø 有三种对应类型的客户:VIP客户,快速客户(办理如交水电费,电话费等业务).

Ø 异步随机生成各种类型的户,生成各类型客户的概率比例为:

VIP客户:普通客户:快速客户 = 1:6:3

Ø 客户办理业务有最大时间和最小时间,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务时间为最小值.

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

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

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

Ø 不要求实现GUI,只考虑系统逻辑实现,可以通过log方式展现程序运行.

项目分析:

用for循环创建出4个普通窗口,再创建出一个快速窗口和一个VIP窗口

接着在创建三个定时器,分别定时创建新的普通客户号码,新的快速客户号码,新的VIP号码

由于有三类客户,每类客户的号码编排都是独立的,所以采用一个管理三种号码和管理器,而这个号码管理器在系统中只能有一个因此设成单例

服务窗口每次都去找号码管理器取当前要服务的号

类图:






代码实现: (注:以下代码并非与类图中类名一致)

importjava.util.ArrayList;
importjava.util.List;
importjava.util.Random;
importjava.util.concurrent.Executors;
importjava.util.concurrent.TimeUnit;

classNumberManager
{
private
int
lastNumber = 1;;
private List<Integer>queueNumber =new ArrayList<Integer>();

// 产生号码
public
synchronized
Integer generateNewManager()
{
// 向集合中存入号码
queueNumber.add(lastNumber);
returnlastNumber++;
}

public
synchronized
Integer fetchServiceNumber()
{
// 取各集合中的第一个号,并删除.
if (queueNumber.size() > 0)
returnqueueNumber.remove(0);
else
return
null
;
}
}

// 服务窗口类型枚举,也可看作是顾客类型,它们是对应的
enumServiceWindowType
{
COMMON, EXPRESS,VIP;

// 覆盖toString()方法
public String toString()
{
switch (this)
{
caseCOMMON:
return"普通";
caseEXPRESS:
return"快速";
caseVIP:
return name();
}
return
null
;
}
}

// 服务窗口类
classServiceWindow
{
private
final static
int
MAX_SERVICE_TIME = 10000;//业务处理最长时间毫秒
private
final static
int
MIN_SERVICE_TIME = 1000;
private ServiceWindowTypetype = ServiceWindowType.COMMON;//当每一次生成窗口实例时,得到窗口的类型,该处设为普通窗口
private
int
windowId = 1;
//外部调用setType给窗口类型赋值
public
void
setType(ServiceWindowType type)
{
this.type = type;
}
//外部调用窗口编号,总共6个窗口1-4号为普通,5号快速,6号为VIP
public
void
setWindowId(int windowId)
{
if (windowId >= 1 && windowId <=6)
this.windowId = windowId;
else
{
//银行不存在第七个窗口,从新赋值
this.windowId = 1;
}
}

// 普通服务
public
void
commonService()
{
System.out.println(windowId +"号" +type +"窗口"
+"获取"
+ ServiceWindowType.COMMON +"窗口业务.....");
Integer number = NumberMachine.getInstance().getCommonManager()
.fetchServiceNumber();
if (number ==null)//number为null表示没有客户
{
System.out.println(windowId +"号" +type +"窗口"
+"获取"
+ ServiceWindowType.COMMON +"窗口业务失败!");
if (type.equals(ServiceWindowType.COMMON))
{
System.out.println(windowId +"号" +type
+ "窗口休息1秒!");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
else
{
long beginTime = System.currentTimeMillis();//当前系统时间毫秒(业务开始办理的时间)
int maxRand =MAX_SERVICE_TIME -MIN_SERVICE_TIME;
int serviceTime =new Random().nextInt(maxRand) + 1
+ MIN_SERVICE_TIME;
try
{
Thread.sleep(serviceTime);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long endTime = System.currentTimeMillis();//业务结束的时间
System.out.println(windowId +"号" +type +"窗口正在为"
+ number +"号"
+ ServiceWindowType.COMMON +"客户服务!" +"耗时"
+ (endTime - beginTime) /1000 +
"秒");
}
}

// 快速服务
public
void
expressService()
{
System.out.println("----"+windowId +"号" +type
+"窗口" +"获取"
+ ServiceWindowType.EXPRESS +"窗口业务.....");
Integer number = NumberMachine.getInstance().getExpressManager()
.fetchServiceNumber();
if (number ==null)
{
System.out.println("----"+windowId +"号" +type
+ "窗口" +"获取"
+ ServiceWindowType.EXPRESS +"窗口业务失败!");
commonService();
}
else
{
try
{
Thread.sleep(MIN_SERVICE_TIME);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("----"+windowId +"号" +type
+ "窗口正在为" + number +"号"
+ type +"客户服务!" +"耗时" +MIN_SERVICE_TIME
/ 1000 +"秒");//快速窗口根据项目要求为最小值(时间..MIN_SERVICE_TIME / 1000)
}

}

// VIP服务
public
void
vipService()
{
System.out.println("====" +windowId +"号" +type
+"窗口" +"获取"
+ ServiceWindowType.VIP +"窗口业务.....");
Integer number = NumberMachine.getInstance().getVipManager()
.fetchServiceNumber();
if (number ==null)
{
System.out.println("====" +windowId +"号" +type
+"窗口" +"获取"
+ ServiceWindowType.VIP +"窗口业务失败!");
commonService();
}
else
{
long beginTime = System.currentTimeMillis();
int maxRand =MAX_SERVICE_TIME -MIN_SERVICE_TIME;
int serviceTime =new Random().nextInt(maxRand) + 1
+ MIN_SERVICE_TIME;//取1001-10000之间的的随机数
try
{
Thread.sleep(serviceTime);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("====" +windowId +"号" +type
+"窗口正在为" + number +"号"
+ type +"客户服务!" +"耗时" + (endTime - beginTime)
/ 1000
+ "秒");
}

}

public
void
start()
{
//创建线程
Executors.newSingleThreadExecutor().execute(new Runnable()
{
public
void
run()
{
System.out.println(windowId +"号" +type
+ "业务窗口开启!");
while (true)
{
switch (type)
{
caseCOMMON:
commonService();
break;
caseEXPRESS:
expressService();
break;
caseVIP:
vipService();
break;
}
}
}
});
}
}

// 管理号码的机器
classNumberMachine
{
//单例设计,只存在一个实例对象
private
static
NumberMachine instance =new NumberMachine();

private NumberMachine()
{
}

public
static
NumberMachine getInstance()
{
returninstance;
}
//三个实例分别为不同的客户类,它们里面的成员lastNumber会各自++,分别自增
private NumberManagercommonManager =new NumberManager();//普通号
private NumberManagerexpressManager =new NumberManager();//快速窗口号
private NumberManagervipManager =new NumberManager();// VIP号
//封装,以便外部访问
public NumberManager getCommonManager()
{
returncommonManager;
}

public NumberManager getExpressManager()
{
returnexpressManager;
}

public NumberManager getVipManager()
{
returnvipManager;
}
}
//程序入口
public
class
Bank
{
public
static void
main(String[] args)
{
//开启4个普通窗口,"工作人员开始叫号"
for (int i = 1; i < 5; i++)
{
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.setType(ServiceWindowType.COMMON);
commonWindow.start();
}
//开启一个快速窗口
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setWindowId(5);
expressWindow.setType(ServiceWindowType.EXPRESS);
expressWindow.start();
//VIP窗口
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setWindowId(6);
vipWindow.setType(ServiceWindowType.VIP);//设置窗口类型
vipWindow.start();

//创建线程并定时运行
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable()
{
public
void
run()
{
Integer number =NumberMachine.getInstance().getCommonManager()
.generateNewManager();
System.out.println(number +"号" + ServiceWindowType.COMMON
+ "客户在等待....");
}
}, 0, 1, TimeUnit.SECONDS);//产生普通客户,每隔一秒钟

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable()
{
public
void
run()
{
Integer number =NumberMachine.getInstance()
.getExpressManager().generateNewManager();
System.out.println(number +"号" + ServiceWindowType.EXPRESS
+ "客户在等待.......");
}
}, 0, 3, TimeUnit.SECONDS);//产生办理快速业务的客户每隔3秒钟

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable()
{
public
void
run()
{
Integer number =NumberMachine.getInstance().getVipManager()
.generateNewManager();
System.out.println(number +"号" + ServiceWindowType.VIP
+ "客户在等待.......");
}
}, 0, 6, TimeUnit.SECONDS);//产生VIP客户每隔6秒钟

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: