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

---------------------- 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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值