现在的位置: 首页 > 综合 > 正文

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

2013年08月01日 ⁄ 综合 ⁄ 共 2793字 ⁄ 字号 评论关闭

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

需求:模拟银行调度系统

思路分析:1,客户的出现:有3仲对应类型的客户,VIP客户,普通客户,快速客户。而客户都是领号排队所以我们想到了创建一个取号机器来产生号码模拟每一个客户,虽然会有3种客户,但是取号器只能有一个,所以取号器需要被设置成单例模式。

2,每一个窗口进行业务:都是问相应的取号机器,是否有客户,如果有就开展业务没有就看看有没有其他业务,有就代为处理,没有就休息。

对象分析:

产生号码机器:

该机器产生号码,并且提供获得号码的方法供取号器使用。于是将各号码定义在一个集合里面,通过不停的往集合中增加和减少元素模拟产生号码和取走号码

同时,产生号码和取走号码是同时进行的,多个线程使用同一个集合,会产生安全隐患,于是定义为同步。

取号机:

取号机需要建立3个产生号码的机器,分别为3个不同的窗口产生客户,在思路分析的过程中,我们也可以看到:银行只能有一个取号机,于是该取号机应当设置为单例模式

窗口:

窗口就必须定义6个窗口,4个普通窗口,1个快速窗口,1个VIP窗口,而且每个窗口开始工作的时候,需要多线程控制并且在自己窗口没有客户的时候需要协助其他窗口工作。

银行大厅:

大厅需要建立6个窗口的实例对象,建立一个取号器,取号器需要不停的输送3种不同的客户。

代码分析:

号码机器:

private int lastNumber;
private List<Integer> queueNumber = new ArrayList<Integer>();
public synchronized Integer generateNewManager(){
queueNumber.add(lastNumber);//此处是为在客户集合中不停的添加客户
return lastNumber++;
}

public synchronized Integer fetchServiceNumber(){
Integer number = null;
if(queueNumber.size()>0)
number = queueNumber.remove(0);//remove方法既删除了元素同时返回值也是此元素。
return number;
}

号码机器只是一个不停产生号码同时取出号码的过程,所以较为简便。

取号器:

private NumberManager commonManager = new NumberManager();//产生3个不同的机器产生号码,既为产生3个集合,每个集合中都有元素
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;
}
private NumberMachine(){}
public static NumberMachine getInstance(){
return instance;
}
private static NumberMachine instance = new NumberMachine();。//单例设计模式以确保在银行内只能产生一台取号器。

取号器需要产生3个号码产生器为3种客户不停的发号。就需要调用到号码产生器中的get方法,所以号码产生器需要线程同步。

窗口:

switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
VIPService();
break;

该代码实现了不同窗口会接受不同的服务对象,同时进行不同的服务。

private void expressService() {
String windowName = "第"+windowId+"号"+ type + "窗口";
System.out.println(windowName+"正在获取任务");
Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
if(number !=null){
long beginTime = System.currentTimeMillis();
//int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
//long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);//处理过程用sleep()方法实现
} catch (InterruptedException e) {

e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(windowName+ "为第"+number+"个"+type+"客户完成服务,耗时"+(endTime));
}else{
System.out.println(windowName+"没有取到任务");
commonService();//没有取到任务的时候会进行普通客户服务,实现了银行要求。
}
}
这里的代码是为窗口的工作原理:
银行大厅:
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();//通过获得manager的类别不同,实现为不同的客户服务。
System.out.println(number+"号普通客户等待服务");

}
},
0, 
Constants.COMMON_CUSTOMER_INTERVIEW_TIME, 
TimeUnit.SECONDS);


总结:1,熟练掌握面向对象的设计理念,对完成代码的思路是大有裨益的。

2,运用多线程时,需要多注意线程安全问题。

3,全心全意做一件事,你就会做到最好。

抱歉!评论已关闭.