银行管理系统的实现以及思路

来源:互联网 发布:apache 允许目录浏览 编辑:程序博客网 时间:2024/05/07 23:56

银行业务调度系统

模拟实现银行业务调度系统罗技,具体需求如下:
*银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。

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

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

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


*?客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所

需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)


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

*当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客

户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

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

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

------------------------------------------------------------------------------------
面向对象的分析与设计
有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随即生成各种类型的客户,各类型客户在

其对应窗口按顺序依次办理业务。

代码实现:
号码机器类

public class NumberMachine {

 private NumberManager commonClient = new NumberManager();
 private NumberManager expressClient = new NumberManager();
 private NumberManager VIPClient = new NumberManager();
 public NumberManager getcommonClient() {
  return commonClient;
 }
 public NumberManager getexpressClient() {
  return expressClient;
 }
 public NumberManager getVIPClient() {
  return VIPClient;
 }
 
 //实现一个单例设计模式
 private NumberMachine(){//封闭该类的new实例化方法
 }
 public static NumberMachine getInstance(){ //创建一个得到对象的方法
  return instance;
 }
 private static NumberMachine instance = new NumberMachine(); // 加了static在虚拟机

开启时就已经开辟了地址准备调用就行了
 
}

 

服务窗口类:
public class ServerWindow {

 private Custom type = Custom.common; //设置叫号类型
 private int WindowId = 1; //初始化窗口号
 public void setType(Custom type) {
  this.type = type;
 }
 public void setWindowId(int windowId) {
  this.WindowId = windowId;
 }
 

 public void start(){// 开始叫号方法
  Executors.newSingleThreadExecutor().execute(new Runnable(){//1.5以后的线程

新技术
   @Override
   public void run() {
//    Integer num = 0;
//    String WindowText = null;
    while (true==true) {
     switch(type){
     case common:
      Common();
      break;
     case express:
      Express();
      break;
     case VIP:
      VIP();
      break;
     }
    }
   }

   
   
   private void Common() {
    Integer num = NumberMachine.getInstance().getcommonClient

().fetchServiceNum(); //客户号
    String WindowText = "第"+WindowId+"号"+type;//窗口类型和窗

口号
    System.out.println(WindowText+"窗口正在获取");
    if(num!=null){
     System.out.println(WindowText+"正在为第"+num+"个"+"

普通"+"客户服务");
     long startTime = System.currentTimeMillis();
     int max = Constant.MAX_SERVER_TIME-

Constant.MIN_SERVER_TIME;
     //得到从1000-10000的随机数
     int maxrandom = new Random().nextInt

(max)+1+Constant.MIN_SERVER_TIME;
     try {
      Thread.sleep(maxrandom);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }//模仿银行,业务操作1-10秒之间
     
     long costTime = System.currentTimeMillis()-

startTime;
     System.out.println(WindowText+"窗口为第"+num

+"号"+type+"客户办理了业务用了"+(costTime/1000)+"秒");
    }else{
     System.out.println(WindowText+"没有获取到任务,休息

一秒");
     try {
      Thread.sleep(1000);//如果没有找到客户,就停

下一秒在继续
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
   
   
   
   
   
   private void Express() {
    Integer num;
    num = NumberMachine.getInstance().getexpressClient

().fetchServiceNum(); //客户号
    String WindowText = "第"+WindowId

+"号"+type.express.toString();
    System.out.println(WindowText+"窗口正在获取");
    if(num!=null){
     long startTime = System.currentTimeMillis();
     int max = Constant.MAX_SERVER_TIME-

Constant.MIN_SERVER_TIME;
     //得到从1000-10000的随机数
     int maxrandom = new Random().nextInt(max

+1)+Constant.MIN_SERVER_TIME;
     try {
       Thread.sleep(maxrandom);//模仿银行,业务操作1-10

秒之间
     } catch (Exception e) {
      e.printStackTrace();
     }
     long costTime = System.currentTimeMillis()-

startTime;
     System.out.println(WindowText+"窗口为第"+num

+"号"+type+"客户办理了业务用了"+(costTime/1000)+"秒");
    }else{
     System.out.println(WindowText+"没有获取到任务");
     Common();
    
    }
   }
   
   
   private void VIP() {
    Integer num;
    num = NumberMachine.getInstance().getVIPClient

().fetchServiceNum(); //客户号
    String WindowText = "第"+WindowId+"号"+type.VIP.toString();
    System.out.println(WindowText+"窗口正在获取");
    if(num!=null){
     long startTime = System.currentTimeMillis();
     int max = Constant.MAX_SERVER_TIME-

Constant.MIN_SERVER_TIME;
     //得到从1000-10000的随机数
     int maxrandom = new Random().nextInt

(max)+1+Constant.MIN_SERVER_TIME;
     try {
       Thread.sleep(maxrandom);//模仿银行,业务操作1-10

秒之间
     } catch (Exception e) {
      e.printStackTrace();
     }
     long costTime = System.currentTimeMillis()-

startTime;
     System.out.println(WindowText+"窗口为第"+num

+"号"+type+"客户办理了业务用了"+(costTime/1000)+"秒");
    }else{
     System.out.println(WindowText+"没有获取到任务");
     Common();
     
    }
   }
   
  });
 }
}


号码管理类:
public class NumberManager {

 private int lastNum = 1; //上一次的号码
    private List<Integer> Numlist = new ArrayList<Integer>();
 public synchronized Integer generateNumber(){ //产生号码 ,如果两个线程同时访问同一

个数据就需要同步。
  Numlist.add(lastNum);
  return lastNum++;
 }
 
 public synchronized Integer fetchServiceNum(){ //得到服务号,为第几号客户服务
//  Integer size = null;
  if(Numlist.size()>0){
   return Numlist.remove(0);
  }
  return null; //每完成一次删除一个最先排号的客户。remover()会返回执行的对象
 }
}


窗口类型管理枚举类:

public enum Custom {

 common,express,VIP;
 @Override
 public String toString() {
  switch(this){
  case common:
   return "普通";
  case express:
   return "快速";
  case VIP:
   return "VIP";
  }
  
  return null;
 }
}

操作时间限制类:
public class Constant {

 public static int MAX_SERVER_TIME = 10000;
 public static int MIN_SERVER_TIME = 1000;
}

 

主方法调用类:
public class MainClass {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  for(int i =1;i<5;i++){
   ServerWindow common = new ServerWindow();
   common.setWindowId(i);//为什么要设置ID?其他的为什么不需要
   common.start();
  }
  
  ServerWindow express = new ServerWindow();
  express.setType(Custom.express);
  express.start();
  
  ServerWindow VIP = new ServerWindow();
  VIP.setType(Custom.VIP);
  VIP.start();
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate( //VIP用户
    new Runnable(){
     @Override
     public void run() {
      // TODO Auto-generated method stub
      int num = NumberMachine.getInstance

().getVIPClient().generateNumber();
      System.out.println("第"+num+"号VIP客户正在

等待服务!");
     }
    },
    0,
    6,
    TimeUnit.SECONDS);
  
  
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate( //快速用户
    new Runnable(){
     @Override
     public void run() {
      // TODO Auto-generated method stub
      int num = NumberMachine.getInstance

().getexpressClient().generateNumber();
      System.out.println("第"+num+"号快速客户正在

等待服务!");
     }
    },
    0,
    3,
    TimeUnit.SECONDS);
  
  
  
  
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate( //普通用户
    new Runnable(){
     @Override
     public void run() {
      // TODO Auto-generated method stub
      int num = NumberMachine.getInstance

().getcommonClient().generateNumber();
      System.out.println("第"+num+"号普通客户正在

等待服务!");
     }
    },
    0,
    1,
    TimeUnit.SECONDS);
 }

}

原创粉丝点击