黑马程序员---银行业务控制系统

来源:互联网 发布:淘宝黑搜原理 编辑:程序博客网 时间:2024/05/22 13:21
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------


  模拟实现银行业务调度系统逻辑,具体需求如下:
  银行内有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 

0 0
原创粉丝点击