黑马程序员 银行业务调度

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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值