银行业务系统图形+代码

需求:

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

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

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

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

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

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

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

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

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

 

   1:画图分析

   2:代码编写

                                                                                                                                        一:

/*
 * 数字管理器
 * */

public class NumberManager {
 //客户()
 private int infoPreson=0;
 private List<Integer> ips=new ArrayList<Integer>();
 public synchronized int  serversManager(){
  ips.add(++infoPreson);
  return infoPreson;
  
 }
 //柜台取出一个
 public synchronized Integer fetchManager(){
  if(ips.size()>0){
   Integer is= ips.remove(0);
  return is;
  }else
  return null;
 }
}


二:

/*
  管理客户类型
 */
public class NumberMathion {
 private NumberManager commManager=new NumberManager();
 private NumberManager expressManager=new NumberManager();
 private NumberManager vipManager=new NumberManager();
 public NumberManager getCommManager() {
  return commManager;
 }
 public NumberManager getExpressManager() {
  return expressManager;
 }
 public NumberManager getVipManager() {
  return vipManager;
 }
 
 //单列模式
 
 private NumberMathion(){}
 private static NumberMathion instans=new NumberMathion();
 public static NumberMathion getInstans(){
  return instans;}
 
}

 

三:

public enum contents {
 COMMEN,EXCPRESS,VIP;
 public String toString(){
  String name=null;
  switch (this) {
  case COMMEN:
   name="普通";
   break;
  case EXCPRESS:
   name="快速";
   break;
  case VIP:
   name=name();
   break;

  }
  return name;
  
 }
}

 

四:

public class ServerWindows {
 private contents type=contents.COMMEN;
 private int number=1;
 
 public contents getType() {
  return type;
 }

 public void setType(contents type) {
  this.type = type;
 }

 public void setNumber(int number) {
  this.number = number;
 }

 public void start(){
  Executors.newSingleThreadExecutor().execute(new Runnable() {
   
   @Override
   public void run() {
    while(true)
    {
     switch(type){
     case COMMEN:
      Comment();
      break;
     case EXCPRESS:
      excpress();
      break;
     case VIP:
      vip();
      break;
     }
    }
   }
  });
 }
   private void vip() {
    String windowTime="第"+number+"号,"+type+"窗口。";
    System.out.println(windowTime+"开始获取任务。");
    //不同窗口开始取票
    Integer serversNumber=NumberMathion.getInstans().getVipManager().fetchManager();
    if(serversNumber!=null)
    {
     //办理时间
     System.out.println(windowTime+"开始为第"+serversNumber+"号VIP客户服务。。。");
     int maxTime=ContensNumber.MAX_TIME-ContensNumber.MIN_TIME;
     int rand=new Random().nextInt(maxTime)+1+ContensNumber.MIN_TIME;
     try {
      Thread.sleep(rand);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     System.out.println(windowTime+"号处理"+serversNumber+"号VIP客户"+"花了"+rand/1000+"秒");
    }else {
     System.out.println("没有取到VIP客户");
     Comment();    
    
    }
   }

   private void excpress() {
    String windowTime="第"+number+"号,"+type+"窗口。";
    System.out.println(windowTime+"开始获取任务。");
    //不同窗口开始取票
    Integer serversNumber=NumberMathion.getInstans().getExpressManager().fetchManager();
    if(serversNumber!=null)
    {
     //办理时间
     System.out.println(windowTime+"开始为第"+serversNumber+"号快速客户服务。。。");
     int minTime=ContensNumber.MIN_TIME;
     
     try {
      Thread.sleep(minTime);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     System.out.println(windowTime+"号处理"+serversNumber+"号快速客户"+"花了"+minTime/1000+"秒");
    }else {
     System.out.println("没有取到快速客户。");
     Comment();    
    
    }
    
   }

   private void Comment() {
    String windowTime="第"+number+"号,"+type+"窗口。";
    System.out.println(windowTime+"开始获取任务。");
    //不同窗口开始取票
    Integer serversNumber=NumberMathion.getInstans().getCommManager().fetchManager();
    if(serversNumber!=null)
    {
     //办理时间
     System.out.println(windowTime+"开始为第"+serversNumber+"号普通客户服务。。。");
     int maxTime=ContensNumber.MAX_TIME-ContensNumber.MIN_TIME;
     int rand=new Random().nextInt(maxTime)+1+ContensNumber.MIN_TIME;
     try {
      Thread.sleep(rand);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     System.out.println(windowTime+"号处理"+serversNumber+"号普通客户"+"花了"+rand/1000+"秒");
    }else {
     System.out.println("没有取到号。休息一秒。");
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    
   }
  
 
}

 

五:


public class ContensNumber {
 public static int MAX_TIME=10000;
 public static int MIN_TIME=1000;
 public static int NUMSERVERS_COUNT=1;
}public class ContensNumber {
 public static int MAX_TIME=10000;
 public static int MIN_TIME=1000;
 public static int NUMSERVERS_COUNT=1;
}public class ContensNumber {
 public static int MAX_TIME=10000;
 public static int MIN_TIME=1000;
 public static int NUMSERVERS_COUNT=1;
}

public class ContensNumber {
 public static int MAX_TIME=10000;
 public static int MIN_TIME=1000;
 public static int NUMSERVERS_COUNT=1;
}

 

六:

public class MainClass {

 /**
  * @param args
  */
 public static void main(String[] args) {
  //生产4个普通窗口
  for(int i=1;i<5;i++){
   ServerWindows sWindows=new ServerWindows();
   sWindows.setNumber(i);
   sWindows.start();
  }
  //生产一个快速窗口
  ServerWindows expressWindows=new ServerWindows();
  expressWindows.setType(contents.EXCPRESS);
  expressWindows.start();
  //生产一个VIP窗口
  ServerWindows vipWindows=new ServerWindows();
  vipWindows.setType(contents.VIP);
  vipWindows.start();
  
  //客户取票
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
   
   @Override
   public void run() {
    Integer comment=NumberMathion.getInstans().getCommManager().serversManager();
    System.out.println("第"+comment+"普通客户正在等待服务。");
    
   }
  }, 0, ContensNumber.NUMSERVERS_COUNT, TimeUnit.SECONDS);
  //快速客户
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
   
   @Override
   public void run() {
    Integer comment=NumberMathion.getInstans().getExpressManager().serversManager();
    System.out.println("第"+comment+"快速客户正在等待服务。");
    
   }
  }, 0, ContensNumber.NUMSERVERS_COUNT*2, TimeUnit.SECONDS);
  //VIP客户
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
   
   @Override
   public void run() {
    Integer comment=NumberMathion.getInstans().getVipManager().serversManager();
    System.out.println("第"+comment+"VIP客户正在等待服务。");
    
   }
  }, 0, ContensNumber.NUMSERVERS_COUNT*6, TimeUnit.SECONDS);
 }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值