黑马程序员---银行业务控制系统
来源:互联网 发布:淘宝黑搜原理 编辑:程序博客网 时间:2024/05/22 13:21
模拟实现银行业务调度系统逻辑,具体需求如下:
银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户 :普通客户 :快速客户 = 1 :6 :3。
客户办理业务所需时间有最大值和最小值
在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,
而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
需求分析:
每个服务窗口都是一个独立运行的对象,因此要创建6个服务窗口线程:ServerWindow()
每个窗口都有两种状态:正常服务状态,空闲状态,普通窗口空闲状态无定义,快速窗口和VIP窗口空闲状态可以服务普通客户;ServerOnNormal(),ServerOnFree()
每个窗口的每种状态对应一个客户队列,普通窗口两种状态对应同一个客户队列,快速窗口和VIP窗口空闲状态对应普通用户队列;
每个用户队列应该能随机生成各自的用户,生成速率由speed变量控制,普通用户速率为6个/10秒,快速用户的速率为3个/10秒,VIP客户的速率为1个/10秒
每个用户都有其需要服务的时间,因此用户对象中应该保存其需要服务的时间,需要服务时间在初始化用户对象时随机赋予;
以下是具体实现代码:
public class BankDemo { public static void main(String[] args) { PersonList VIP = new PersonList("VIP");//VIP窗口队列 PersonList NORMAL = new PersonList("NORMAL");//普通窗口队列 PersonList QUICKLY = new PersonList("QUICKLY");//快速窗口队列 VIP.start();//启动VIP窗口队列进程 NORMAL.start();//启动普通窗口队列进程 QUICKLY.start();//启动快速窗口队列进程 new ServerWindow("普通服务窗口1", NORMAL, NORMAL).start();//创建并启动普通窗口1 new ServerWindow("普通服务窗口2", NORMAL, NORMAL).start();//创建并启动普通窗口2 new ServerWindow("普通服务窗口3", NORMAL, NORMAL).start();//创建并启动普通窗口3 new ServerWindow("普通服务窗口4", NORMAL, NORMAL).start();//创建并启动普通窗口4 new ServerWindow("VIP服务窗口", VIP, NORMAL).start();//创建并启动VIP窗口 new ServerWindow("快速服务窗口", QUICKLY, NORMAL).start();//创建并启动快速窗口 }}class PersonList extends Thread {/* 为了更有表现性,这里将客户办理业务的最大时间设置成小于客户生成时间, */ private LinkedList<Person> personlist = new LinkedList<Person>();//排队办理业务的用户队列 private Random random = new Random();//随机数生成器 private String type;// 客户类型 private int speed;// 生成客户的速度 private int personNum = 0;// 客户计数器 //private final static int maxTime = 5;// 客户办理业务最大时间 private final static int minTime = 1;// 客户办理业务最小时间 public PersonList(String type) {//根据用户队列的类型确定用户的生成速度 this.type = type; if (type == "VIP") speed = 1; if (type == "NORMAL") speed = 6; if (type == "QUICKLY") speed = 3; } private void randPerson() {//随机生成不同类型的客户 if (random.nextInt(10) < speed) personlist.addLast(new Person(randTime(), type + personNum++)); } private int randTime() {//为每个客户随机生成办理业务所需要的时间 if (type == "QUICKLY") return minTime; return random.nextInt(4) + minTime; } public void run() { while (true) { randPerson(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized Person getPerson() { return personlist.pollFirst(); }}class ServerWindow extends Thread { private PersonList SON;//正常服务时的客户队列 private PersonList SOF;//空闲时服务的客户队列 private String windowName;//服务窗口名称 public ServerWindow(String windowName, PersonList SON, PersonList SOF) { this.windowName = windowName; this.SON = SON; this.SOF = SOF; } private boolean ServerOnNormal() {//窗口正常工作时调用该函数为各自的用户队列服务,当窗口变为空闲时该函数返回false Person serveringPerson = SON.getPerson(); if (serveringPerson != null) { System.out.println(windowName + ":---当前正在为" + serveringPerson.getPersonName() + "服务"); try { Thread.sleep(serveringPerson.getServerTime() * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "为:---" + serveringPerson.getPersonName()+"服务"+serveringPerson.getServerTime()+"秒" + "已经办理完业务,请下一位"); return true; } return false; } private void ServerOnFree() {//窗口空闲时调用该函数为普通用户服务 Person serveringPerson = SOF.getPerson(); if (serveringPerson != null) { System.out.println(windowName + ":---当前正在为" + serveringPerson.getPersonName()+ "服务"); try { Thread.sleep(serveringPerson.getServerTime() * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "为:---" + serveringPerson.getPersonName()+"服务"+serveringPerson.getServerTime()+"秒" + "已经办理完业务,请下一位"); } } public void run() { while (true) { if (!ServerOnNormal()) ServerOnFree(); } }}class Person {//客户类 private int ServerTime;//客户需要服务的时间 private String PersonName;//客户名字 public int getServerTime() { return ServerTime; } public String getPersonName(){ return PersonName; } public Person(int ServerTime, String PersonName) { this.ServerTime = ServerTime; this.PersonName = PersonName; }}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com
- 黑马程序员---银行业务控制系统
- 黑马程序员---交通灯控制系统
- 《黑马程序员》银行业务调度
- 黑马程序员:银行业务调度
- 黑马程序员:银行业务调度
- 黑马程序员-银行业务
- 黑马程序员 银行业务调度
- 黑马程序员-银行业务
- 黑马程序员-java银行业务
- 黑马程序员--银行业务调度
- 黑马程序员--银行业务系统
- 黑马程序员--银行业务调度
- 【黑马程序员】银行业务系统
- 黑马程序员----------------------银行业务调度
- 黑马程序员-银行业务调度
- 黑马程序员-银行业务调度
- 黑马程序员 银行业务系统
- 黑马程序员-银行业务系统
- 解决 虚拟机VirtualBox安装ubuntu 12.04LTS x32 The system is running in low-graphics mode问题
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- 我爱你,亲爱的。
- 随机数——Linux C编程
- Demo
- 黑马程序员---银行业务控制系统
- 链队列
- 随机数 权重 概率
- Struts2远程代码执行漏洞分析(S2-013)
- 初识计算几何、
- android 自定义view
- keil 默认包含目录
- HashMap遍历的两种方式,推荐使用entrySet()
- LINUX使用nohup命令后台执行提交作业