您的位置:首页 > 其它

DAY25-银行业务调度系统 小结

2014-05-11 19:06 246 查看
---------------------- 拖走FM----期待与您交流! --------

收音机,电台,网上电台,广播,在线广播,网络广播,广播电台,网络电台,在线电台,电台在线收听,广播电台在线收听,网络电台在线收听,在线收听电台,fm收音机,网络收音机,广播下载,在线收音机,收音机软件下载,电台软件下载,网络收音机下载--------------

---------------------- 拖走FM----期待与您交流! --------

银行业务调度系统 小结

1 项目需求

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

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

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

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

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

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

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


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

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

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

2 实现思路

1 有三个对应类型的客户 VIP客户 普通客户 快速客户

2 对这些客户异步的进行随机生成,然后在其对应的窗口进行顺序依次办理业务

3 具体就需要有一个银行客户取号器 生成号码

4 取号的时候分为三种客户 分别到各自的窗口进行办理业务

5 然后就是窗口按照各自办理客户顺序叫号

6 对各自号码进行系统管理,也就是要多三个客户类型号码进行分别管理

7 实现的数据结构图:





3 实现步骤

1 定义一个号码产生器 NumberManager 随机的产生号码

2 定义三个成员变量分别指向三个NumberManager对象 分别表示三种客户类型

3 将NumberMachine类设计为单例设计

4 构造CustomerType枚举类 主要用于定义三种客户类型

5 建立一个服务窗口 采用多线程的方式实现 ServiceWindow类

6 创建MainClass类 用于建立4个普通窗口和1个vip及快速窗口

7 建立一个Constants类 主要用于定义客户的类型

4 具体代码

1 [b]NumberManager 主要实现号码的取号管理[/b]

package com.itheima.bank;

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

public class NumberManager {
private int lastNumber = 0;
private List queueNumbers = new ArrayList();

public synchronized Integer generateNewNumber(){//为客户服务,客户来了取走一个队号
queueNumbers.add(++lastNumber);
return lastNumber;
}

public synchronized Integer fetchNumber(){//服务于窗口,服务完一个叫下一个
if(queueNumbers.size()>0){
return (Integer)queueNumbers.remove(0);
}else{
return null;
}
}
}
2 NumberMachine 主要是号码的顺序以及权限进行生成和分配



package com.itheima.bank;

public class NumberMachine {

private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}

private NumberManager commonManager = new NumberManager();
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;
}

}


3 CustomerType 定义客户的类型



package com.itheima.bank;

public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
String name = null;
switch(this){
case COMMON:
name = "普通";
break;
case EXPRESS:
name = "快速";
break;
case VIP:
name = name();
break;
}
return name;
}
}


4 Constants 客户的生成



package com.itheima.bank;

public class Constants {
public static int MAX_SERVICE_TIME = 10000; //10秒!
public static int MIN_SERVICE_TIME = 1000; //1秒!

/*每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来
* 平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以,
* 1秒钟产生一个普通客户比较合理,*/
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}


5 MainClass 主函数



package com.itheima.bank;

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

public class MainClass {

private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");

public static void main(String[] args) {
//产生4个普通窗口
for(int i=1;i<5;i++){
ServiceWindow window =  new ServiceWindow();
window.setNumber(i);
window.start();
}

//产生1个快速窗口
ServiceWindow expressWindow =  new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();

//产生1个VIP窗口
ServiceWindow vipWindow =  new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();

//普通客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();
/**
* 采用logger方式,无法看到直观的运行效果,因为logger.log方法内部并不是直接把内容打印出出来,
* 而是交给内部的一个线程去处理,所以,打印出来的结果在时间顺序上看起来很混乱。
*/
//logger.info("第" + serviceNumber + "号普通客户正在等待服务!");
System.out.println("第" + serviceNumber + "号普通客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit.SECONDS);

//快速客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewNumber();
System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,
TimeUnit.SECONDS);

//VIP客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getVipManager().generateNewNumber();
System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
TimeUnit.SECONDS);
}
}


6 ServiceWindow 模拟银行窗口

package com.itheima.bank;

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

/**
* 没有把VIP窗口和快速窗口做成子类,是因为实际业务中的普通窗口可以随时被设置为VIP窗口和快速窗口。
* */
public class ServiceWindow {
private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");
private CustomerType type = CustomerType.COMMON;
private int number = 1;

public CustomerType getType() {
return type;
}

public void setType(CustomerType type) {
this.type = type;
}

public void setNumber(int number){
this.number = number;
}

public void start(){
Executors.newSingleThreadExecutor().execute(
new Runnable(){
public void run(){
//下面这种写法的运行效率低,最好是把while放在case下面
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
}
);
}

private void commonService(){
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取普通任务!");
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();
if(serviceNumber != null ){
System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");
int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+1 + 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();
}
}
}

private void expressService(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取快速任务!");
if(serviceNumber !=null){
System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务");
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 + "没有取到快速任务!");
commonService();
}
}

private void vipService(){

Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取VIP任务!");
if(serviceNumber !=null){
System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务");
int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+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任务!");
commonService();
}
}
}


5 运行结果

第1号普通窗口开始获取普通任务!
第4号普通窗口开始获取普通任务!
第3号普通窗口开始获取普通任务!
第1号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口没有取到普通任务,正在空闲一秒
第3号普通窗口没有取到普通任务,正在空闲一秒
第4号普通窗口没有取到普通任务,正在空闲一秒
第2号普通窗口开始获取普通任务!
第2号普通窗口没有取到普通任务,正在空闲一秒
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口没有取到VIP任务!
第1号VIP窗口开始获取普通任务!
第1号VIP窗口没有取到普通任务,正在空闲一秒
第1号普通客户正在等待服务!
第1号快速客户正在等待服务!
第1号VIP客户正在等待服务!
第3号普通窗口开始获取普通任务!
第1号快速窗口开始获取快速任务!
第1号普通窗口开始获取普通任务!
第1号快速窗口开始为第1号快速客户服务
第3号普通窗口开始为第1号普通客户服务
第1号普通窗口没有取到普通任务,正在空闲一秒
第2号普通窗口开始获取普通任务!
第1号VIP窗口开始获取VIP任务!
第4号普通窗口开始获取普通任务!
第1号VIP窗口开始为第1号VIP客户服务
第2号普通窗口没有取到普通任务,正在空闲一秒
第4号普通窗口没有取到普通任务,正在空闲一秒
第2号普通客户正在等待服务!
第1号普通窗口开始获取普通任务!
第1号快速窗口完成为第1号快速客户服务,总共耗时1秒
第1号普通窗口开始为第2号普通客户服务
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口没有取到普通任务,正在空闲一秒
第2号普通窗口开始获取普通任务!
第2号普通窗口没有取到普通任务,正在空闲一秒
第4号普通窗口开始获取普通任务!
第4号普通窗口没有取到普通任务,正在空闲一秒
第3号普通客户正在等待服务!
第2号快速客户正在等待服务!
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第2号快速客户服务
第2号普通窗口开始获取普通任务!
第4号普通窗口开始获取普通任务!
第2号普通窗口开始为第3号普通客户服务
第4号普通窗口没有取到普通任务,正在空闲一秒
第4号普通客户正在等待服务!
第1号快速窗口完成为第2号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口开始为第4号普通客户服务
第4号普通窗口开始获取普通任务!
第4号普通窗口没有取到普通任务,正在空闲一秒
第1号VIP窗口完成为第1号VIP客户服务,总共耗时3秒
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口没有取到VIP任务!
第1号VIP窗口开始获取普通任务!
第1号VIP窗口没有取到普通任务,正在空闲一秒
第5号普通客户正在等待服务!
第3号快速客户正在等待服务!
第4号普通窗口开始获取普通任务!
第4号普通窗口开始为第5号普通客户服务
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口没有取到VIP任务!
第1号VIP窗口开始获取普通任务!
第1号VIP窗口没有取到普通任务,正在空闲一秒
第6号普通客户正在等待服务!
第2号普通窗口完成为第3号普通客户服务,总共耗时2秒
第2号普通窗口开始获取普通任务!
第2号普通窗口开始为第6号普通客户服务
第1号VIP窗口开始获取VIP任务!
第7号普通客户正在等待服务!
第1号VIP窗口没有取到VIP任务!
第1号VIP窗口开始获取普通任务!
第1号VIP窗口开始为第7号普通客户服务
第4号快速客户正在等待服务!
第2号VIP客户正在等待服务!
第2号普通窗口完成为第6号普通客户服务,总共耗时1秒
第2号普通窗口开始获取普通任务!
第2号普通窗口没有取到普通任务,正在空闲一秒
第8号普通客户正在等待服务!
第2号普通窗口开始获取普通任务!
第2号普通窗口开始为第8号普通客户服务
第9号普通客户正在等待服务!
第5号快速客户正在等待服务!
第1号普通窗口完成为第2号普通客户服务,总共耗时6秒
第1号普通窗口开始获取普通任务!
第1号普通窗口开始为第9号普通客户服务
第3号普通窗口完成为第1号普通客户服务,总共耗时7秒
第3号普通窗口开始获取普通任务!
第3号普通窗口没有取到普通任务,正在空闲一秒
第10号普通客户正在等待服务!
第1号普通窗口完成为第9号普通客户服务,总共耗时1秒
第1号普通窗口开始获取普通任务!
第1号普通窗口开始为第10号普通客户服务
第3号普通窗口开始获取普通任务!
第3号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口完成为第4号普通客户服务,总共耗时5秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第3号快速客户服务
第11号普通客户正在等待服务!
第6号快速客户正在等待服务!
第4号普通窗口完成为第5号普通客户服务,总共耗时5秒
第4号普通窗口开始获取普通任务!
第4号普通窗口开始为第11号普通客户服务
第3号普通窗口开始获取普通任务!
第3号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口完成为第3号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第4号快速客户服务
第12号普通客户正在等待服务!
第3号普通窗口开始获取普通任务!
第3号普通窗口开始为第12号普通客户服务
第1号快速窗口完成为第4号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第5号快速客户服务
第13号普通客户正在等待服务!
第7号快速客户正在等待服务!
第3号VIP客户正在等待服务!
第1号VIP窗口完成为第7号普通客户服务,总共耗时6秒
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口开始为第2号VIP客户服务
第2号普通窗口完成为第8号普通客户服务,总共耗时4秒
第2号普通窗口开始获取普通任务!
第2号普通窗口开始为第13号普通客户服务
第1号快速窗口完成为第5号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第6号快速客户服务
第14号普通客户正在等待服务!
第3号普通窗口完成为第12号普通客户服务,总共耗时1秒
第3号普通窗口开始获取普通任务!
第3号普通窗口开始为第14号普通客户服务
第1号快速窗口完成为第6号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第7号快速客户服务
第15号普通客户正在等待服务!
第8号快速客户正在等待服务!
第1号快速窗口完成为第7号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第8号快速客户服务
第16号普通客户正在等待服务!
第1号普通窗口完成为第10号普通客户服务,总共耗时6秒
第1号普通窗口开始获取普通任务!
第1号普通窗口开始为第15号普通客户服务
第1号快速窗口完成为第8号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口开始为第16号普通客户服务
第17号普通客户正在等待服务!
第9号快速客户正在等待服务!
第4号普通窗口完成为第11号普通客户服务,总共耗时5秒
第4号普通窗口开始获取普通任务!
第4号普通窗口开始为第17号普通客户服务
第1号VIP窗口完成为第2号VIP客户服务,总共耗时4秒
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口开始为第3号VIP客户服务
第18号普通客户正在等待服务!
第2号普通窗口完成为第13号普通客户服务,总共耗时5秒
第2号普通窗口开始获取普通任务!
第2号普通窗口开始为第18号普通客户服务
第1号快速窗口完成为第16号普通客户服务,总共耗时2秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第9号快速客户服务
第19号普通客户正在等待服务!
第10号快速客户正在等待服务!
第4号VIP客户正在等待服务!
第1号快速窗口完成为第9号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第10号快速客户服务
第20号普通客户正在等待服务!
第4号普通窗口完成为第17号普通客户服务,总共耗时3秒
第4号普通窗口开始获取普通任务!
第4号普通窗口开始为第19号普通客户服务
第1号快速窗口完成为第10号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口开始为第20号普通客户服务
第21号普通客户正在等待服务!
第11号快速客户正在等待服务!
第22号普通客户正在等待服务!
第3号普通窗口完成为第14号普通客户服务,总共耗时8秒
第3号普通窗口开始获取普通任务!
第3号普通窗口开始为第21号普通客户服务
第1号普通窗口完成为第15号普通客户服务,总共耗时5秒
第1号普通窗口开始获取普通任务!
第1号普通窗口开始为第22号普通客户服务
第2号普通窗口完成为第18号普通客户服务,总共耗时4秒
第2号普通窗口开始获取普通任务!
第2号普通窗口没有取到普通任务,正在空闲一秒
第23号普通客户正在等待服务!
第12号快速客户正在等待服务!
第2号普通窗口开始获取普通任务!
第2号普通窗口开始为第23号普通客户服务
第24号普通客户正在等待服务!
第25号普通客户正在等待服务!
第13号快速客户正在等待服务!
第5号VIP客户正在等待服务!
第1号快速窗口完成为第20号普通客户服务,总共耗时4秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第11号快速客户服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: