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

来源:互联网 发布:淘宝点击热力图 编辑:程序博客网 时间:2024/05/21 07:58

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------详细请查看:http://edu.csdn.net 



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

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

  -->取钱服务窗口(ServerWindow)

  -->普通窗口(common),快速窗口(express),VIP窗口(vip)

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

  -->客户(Customer)

  -->普通客户(common),快速客户(express),VIP客户(vip)

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

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

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

  -->所需时间有最大值(MAX_TIME)和最小值(MIN_TIME)

   -->VIP客户(vip,普通客户(common)办理业务所需时间:(MAX_TIME ~MIN_TIME)

   -->>快速客户(express)办理业务所需时间:MIN_TIME

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

   -->客户在其对应窗口按顺序依次办理业务(排队)

   -->>取钱需排队等(客户各自在各自对应的窗口取钱 )

   -->>>其中普通窗口为4个

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

   -->特殊情况:只有当VIP或express窗口有剩余时,才允许处理普通客户的业务。其他情况下VIP或窗口express不允许处理普通客户的业务;(VIP或窗口express普通用户优先级最低)

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

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

 

类代码的的编写:

1)NumberManager类:

定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。

定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。

import java.util.ArrayList;

import java.util.List;

public class NumberManager {
//定义最初的客户号
private int lastNumber = 0;
//把产生的新号码往集合里存
private List queueNumbers = newArrayList();

public synchronized IntegergenerateNewNumber(){

queueNumbers.add( lastNumber);

return lastNumber;

}
//取号操作
public synchronized Integer fetchNumber(){
if(queueNumbers.size()>0){

return (Integer)queueNumbers.remove(0);

}else{

return null;

}

}

}
2)NumberMachine类
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。

将NumberMachine类设计成单例。
public class NumberMachine {
private NumberMachine(){}

private static NumberMachine instance = newNumberMachine();

public static NumberMachine getInstance(){

return instance;

}

private NumberManager commonManager = newNumberManager();

private NumberManager expressManager = newNumberManager();

private NumberManager vipManager = newNumberManager();

public NumberManager getCommonManager() {

return commonManager;

}

public NumberManager getExpressManager() {

return expressManager;

}

public NumberManager getVipManager() {

return vipManager;

}
 
}
3)CustomerType枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。

重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。

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)ServiceWindow类
定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。

定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。

import java.util.Random;

import java.util.concurrent.Executors;

import java.util.logging.Logger;
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 = newRandom().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();

}

}
//VIP服务
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 = newRandom().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();

}

}

}

4)MainClass类

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

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

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.info("第" serviceNumber "号普通客户正在等待服务!");

System.out.println("第" serviceNumber "号普通客户正在等待服务!");

}

},

0,

Constants.COMMON_CUSTOMER_INTERVAL_TIME,imeUnit.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);

}

}

5)Constants类

定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME

public class Constants {
//规定服务时间的长短
public static int MAX_SERVICE_TIME = 10000;//10秒!

public static int MIN_SERVICE_TIME = 1000;//1秒!
//规定三种客户服务时间的间隔
public static intCOMMON_CUSTOMER_INTERVAL_TIME = 1;
public static int EXPRESS_CUSTOMER_INTERVAL_TIME = 2;
public static int VIP_CUSTOMER_INTERVAL_TIME = 6;

}

 

 

 

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------详细请查看:http://edu.csdn.net  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁宝宝乳牙腐蚀怎么办 1岁宝宝门牙腐蚀怎么办 3岁宝宝有蛀牙怎么办 3岁宝宝乳牙腐蚀怎么办 三岁宝宝烂牙怎么办 宝宝牙被腐蚀了怎么办 嗓子声音变粗了怎么办 玩网游钱被骗了怎么办 家里的白墙脏了怎么办 月经弄到床垫上怎么办 出租房墙面太脏怎么办 苹果6镜头模糊了怎么办 6s前摄像头进灰怎么办 手机镜头进灰了怎么办 6s摄像头进灰了怎么办 7plus摄像头进灰怎么办 苹果喇叭进灰了怎么办 苹果7摄像头进灰怎么办 锁眼里胶水堵了 怎么办 锁眼被牙签堵了怎么办 锁孔被胶水堵了怎么办 快手上不了同城怎么办 昌珉入伍宋茜怎么办 嗓子里卡了鱼刺怎么办 在餐厅吃到虫子怎么办 在餐厅吃出虫子怎么办 孕妇被虫子咬了怎么办 吃外卖吃到虫子怎么办 杯子盖拧错位了怎么办 身边有吸毒的人怎么办 如果牛难产了怎么办要 牛难产拉不出来怎么办 老公发现老婆有外遇怎么办 睡眠不好半夜老是醒怎么办 拔完智齿肿了怎么办 拔牙后咽口水疼怎么办 吃了脏东西拉肚子怎么办 微信遇到仙人跳怎么办 牙有裂痕疼应该怎么办 胸罩在学校掉了怎么办 锁屏密码忘记了怎么办