黑马程序员 银行业务调度

来源:互联网 发布:linux原生迅雷 编辑:程序博客网 时间:2024/05/21 08:55

------- android培训、java培训、期待与您交流! ----------

  1. package cn.itcast.bank;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Random;  
  6. import java.util.concurrent.Executors;  
  7. import java.util.concurrent.TimeUnit;  
  8.   
  9. public class MainClass {  
  10.     public static void main(String[] args) {  
  11.         int windowNumber;// 窗口编号  
  12.         /* 创建4个普通窗口 */  
  13.         for (windowNumber = 1; windowNumber <= 4; windowNumber++) {  
  14.             new ServiceWindow(CustomerType.GENERAL, windowNumber);  
  15.         }  
  16.         new ServiceWindow(CustomerType.FAST, windowNumber++);// 创建1个快速窗口  
  17.         new ServiceWindow(CustomerType.VIP, windowNumber++);// 创建1个VIP窗口  
  18.         NumberMachine.getInstance().open();// 打开号码管理器的开关  
  19.     }  
  20. }  
  21.   
  22. /* 服务窗口类 */  
  23. class ServiceWindow {  
  24.     private static NumberMachine numberMachine = NumberMachine.getInstance();// 所有服务窗口共享一个号码管理器  
  25.     private CustomerType type;// 窗口类型  
  26.     private int number;// 窗口编号  
  27.   
  28.     /** 
  29.      * @param type 
  30.      *            窗口类型 
  31.      * @param number 
  32.      *            窗口编号 
  33.      */  
  34.     public ServiceWindow(CustomerType type, int number) {  
  35.         this.number = number;  
  36.         this.type = type;  
  37.         Executors.newScheduledThreadPool(1).schedule(new Runnable() {  
  38.             @Override  
  39.             public void run() {  
  40.                 Random random = new Random();  
  41.                 do {  
  42.                     /* 向号码管理器索取下一个顾客,如果没有索取到则返回null */  
  43.                     Customer customer = numberMachine.getCustomer(ServiceWindow.this);  
  44.                     if (null == customer) {  
  45.                         System.out.println(ServiceWindow.this.getNumber()  
  46.                                 + "号窗口空闭中");  
  47.                         try {  
  48.                             Thread.sleep(2000);// 窗口休息2秒再进行下一次索取  
  49.                         } catch (InterruptedException e) {  
  50.                             e.printStackTrace();  
  51.                         }  
  52.                     } else {  
  53.                         System.out.println(customer.toString() + "到"  
  54.                                 + ServiceWindow.this.getNumber() + "号窗口办理业务");  
  55.                         try {  
  56.                             Thread.sleep((random.nextInt(19000) + 1000));// 如果索取到了顾客,随机生成为该顾客服务的时间  
  57.                         } catch (InterruptedException e) {  
  58.                             e.printStackTrace();  
  59.                         }  
  60.                         System.out.println(ServiceWindow.this.getNumber()  
  61.                                 + "号窗口为" + customer.toString() + "办理完毕");  
  62.                     }  
  63.                 } while (true);  
  64.             }  
  65.   
  66.         }, 0, TimeUnit.SECONDS);  
  67.     }  
  68.   
  69.     public int getNumber() {  
  70.         return number;// 返回窗口的的编号  
  71.     }  
  72.   
  73.     public CustomerType getType() {  
  74.         return type;// 返回窗口的类型  
  75.     }  
  76. }  
  77.   
  78. /* 号码管理器类 */  
  79. class NumberMachine {  
  80.     private int customers = 0;// 客户编号,每来一个顾客,这个编号的值就会增加1  
  81.     private List<customer> generalList = new ArrayList<customer>();// 普通用户队列  
  82.     private List<customer> fastList = new ArrayList<customer>();// 快速用户队列  
  83.     private List<customer> VIPList = new ArrayList<customer>();// VIP用户队列  
  84.     private static NumberMachine numberMachine = new NumberMachine();// 单例  
  85.     private boolean onOff = false;// 号码管理器的开关初始状态为关  
  86.   
  87.     private NumberMachine() {  
  88.     }  
  89.   
  90.     public static NumberMachine getInstance() {  
  91.         return numberMachine;  
  92.     }  
  93.   
  94.     public void open() {// 打开开关,让号码管理器开始工作  
  95.         onOff = true;  
  96.         Executors.newScheduledThreadPool(1).schedule(new Runnable() {  
  97.             @Override  
  98.             public void run() {  
  99.                 Random random = new Random();  
  100.                 while (onOff) {  
  101.                     try {  
  102.                         Thread.sleep((random.nextInt(3) + 1) * 1000);// 随机生成顾客到来的时间间隔  
  103.                     } catch (InterruptedException e) {  
  104.                         e.printStackTrace();  
  105.                     }  
  106.                     switch (random.nextInt(10)) {// VIP客户:快速客户:普通客户=1:3:6  
  107.                     case 0:  
  108.                         /* VIP客户加入到VIP用户队列 */  
  109.                         VIPList.add(new Customer(CustomerType.VIP, ++customers));  
  110.                         System.out.println(VIPList.get(VIPList.size() - 1)  
  111.                                 .toString() + "进入VIP用户队列");  
  112.                         break;  
  113.                     case 1:  
  114.                     case 2:  
  115.                     case 3:  
  116.                         /* 快速用户加入到快速用户队列 */  
  117.                         fastList.add(new Customer(CustomerType.FAST,  
  118.                                 ++customers));  
  119.                         System.out.println(fastList.get(fastList.size() - 1)  
  120.                                 .toString() + "进入快速用户队列");  
  121.                         break;  
  122.                     default:  
  123.                         /* 普通用户加入到普通用户队列 */  
  124.                         generalList.add(new Customer(CustomerType.GENERAL,  
  125.                                 ++customers));  
  126.                         System.out.println(generalList.get(  
  127.                                 generalList.size() - 1).toString()  
  128.                                 + "进入普通用户队列");  
  129.                     }  
  130.                 }  
  131.             }  
  132.         }, 0, TimeUnit.SECONDS);  
  133.   
  134.     }  
  135.   
  136.     /* 多个线程都在向号码管理器索取客户,所以要同步,如果不同步可能会出现两个窗口取到同一个客户 */  
  137.     public synchronized Customer getCustomer(ServiceWindow serviceWindow) {  
  138.         Customer customer = null;// 取到的客户,初始值为null  
  139.         switch (serviceWindow.getType()) {  
  140.         case GENERAL:// 普通窗口在索取  
  141.             if (0 < generalList.size()) {  
  142.                 customer = generalList.remove(0);  
  143.             } else if (0 < VIPList.size()) {  
  144.                 customer = VIPList.remove(0);  
  145.             } else if (0 < fastList.size()) {  
  146.                 customer = fastList.remove(0);  
  147.             }  
  148.             break;  
  149.         case FAST:// 快速窗口在索取  
  150.             if (0 < fastList.size()) {  
  151.                 customer = fastList.remove(0);  
  152.             } else if (0 < VIPList.size()) {  
  153.                 customer = VIPList.remove(0);  
  154.             } else if (0 < generalList.size()) {  
  155.                 customer = generalList.remove(0);  
  156.             }  
  157.             break;  
  158.         case VIP:// VIP窗口在索取  
  159.             if (0 < VIPList.size()) {  
  160.                 customer = VIPList.remove(0);  
  161.             } else if (0 < generalList.size()) {  
  162.                 customer = generalList.remove(0);  
  163.             } else if (0 < fastList.size()) {  
  164.                 customer = fastList.remove(0);  
  165.             }  
  166.         }  
  167.         return customer;// 返回取到的客户  
  168.     }  
  169.   
  170.     public void close() {// 关闭号码管理器  
  171.         onOff = false;  
  172.     }  
  173. }  
  174.   
  175. class Customer {  
  176.     private CustomerType type;// 客户类型  
  177.     private int number;// 客户编号  
  178.   
  179.     public Customer(CustomerType type, int number) {  
  180.         this.type = type;  
  181.         this.number = number;  
  182.     }  
  183.   
  184.     public String toString() {  
  185.         switch (type) {  
  186.         case GENERAL:  
  187.             return "第" + number + "号普通用户";  
  188.         case FAST:  
  189.             return "第" + number + "号快速用户";  
  190.         case VIP:  
  191.             return "第" + number + "号VIP用户";  
  192.         }  
  193.         return null;  
  194.     }  
  195.   
  196.     public CustomerType getType() {  
  197.         return type;  
  198.     }  
  199.   
  200.     public void setType(CustomerType type) {  
  201.         this.type = type;  
  202.     }  
  203.   
  204.     public int getNumber() {  
  205.         return number;  
  206.     }  
  207.   
  208.     public void setNumber(int number) {  
  209.         this.number = number;  
  210.     }  
  211. }  
  212.   
  213. /* 3种不同的服务类型 */  
  214. enum CustomerType {  
  215.     GENERAL, FAST, VIP  
  216. };  
  217.   
  218. </customer></customer></customer></customer></customer></customer>  

 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子一直流清水鼻涕怎么办 宝宝鼻子呼噜呼噜响怎么办 鼻涕往嗓子里流怎么办 咳嗽痰多鼻涕多怎么办 没感冒嗓子痰多鼻涕怎么办 孩子感冒后鼻涕特别多怎么办 经常有鼻涕怎么办才好 怀孕后鼻涕痰多怎么办 鼻炎有鼻涕痰多怎么办 宝宝咳嗽痰多鼻涕多怎么办 宝宝两岁清鼻涕咳嗽痰多怎么办 喉咙咸咸的有痰怎么办 宝宝咳嗽鼻塞喉咙有痰怎么办 绝地求生刺激战场射击键误触怎么办 在皮卡堂卡的游泳了怎么办 假如遇到老赖没能力还钱怎么办 服刑人拒不执行伤害赔偿怎么办? 面对当前严峻形势作为军人怎么办 想起诉不知道对方地址怎么办 遇见家里来嫌疑人员怎么办 老滚5老婆死了怎么办 美化包安装之后闪退怎么办 蕉下的伞坏了怎么办 苹果7通话音质特别差怎么办 雨伞的伞骨坏了怎么办 雨伞的铁丝掉了怎么办 手机银行验证码忘了怎么办 应用安装验证码忘了怎么办 大王卡激活码找不到了怎么办 信用卡的激活码找不到怎么办 育碧账号忘了怎么办 uplay八折券丢了怎么办 不小心按到了育碧解绑怎么办 台式电脑连不上网怎么办 重装系统也安装不了cad怎么办 染发灰色偏绿了怎么办 vgm数据填错了怎么办 克里格插值 不符合正态分布怎么办 克里金插值无效的输出范围怎么办 穿完臭袜子要洗手吗不洗怎么办 超敏c反应蛋白117怎么办