本帖最后由 hanxing 于 2014-11-9 16:00 编辑
张老师在他的7k项目中分别为三个类型的窗口写了三个方法,其中这三个方法代码大部分是重复,所以我想能不能把他们融合成一个通用方法呢,经过一番奋战,终于改出来了,比想象中的要难点,期间出了很多个bug,还是被我一个一个解决了,有点小激动.为了满足一下我的虚荣心;P,分享给大家.如果大家有更简洁易懂的方法或者是意见,,欢迎讨论.
- import java.util.Random;
- import java.util.concurrent.Executors;
- public class ServiceWindow {
- int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
- int serviceTime = new Random().nextInt(maxRandom)
- + Constants.MIN_SERVICE_TIME;// 设置默认办理业务的时间
- int flag = 0; // 控制非普通窗口执行普通任务的标志
- // 1.打开转换窗口类型代码的钥匙2.用来存储非普通"变"为普通窗口之前类型/ 3.阻止普通窗口的锁
- CustomerType typeFlag = CustomerType.COMMON;
- private CustomerType windowType;
- private CustomerType customerType;
- private int windowID = 1;
- public void setWindowType(CustomerType windowType) {
- this.windowType = windowType;
- }
- public void setWindowID(int windowID) {
- this.windowID = windowID;
- }
- public void start() {
- Executors.newSingleThreadExecutor().execute(new Runnable() {
- public void run() {
- while (true)
- startService();
- }
- });
- }
- private void startService() {
- Integer serviceNumber = null;
- NumberMachine instance = NumberMachine.getInstance();// 获取取号机的实例
- switch (windowType) {
- case COMMON:// common入口
- serviceNumber = instance.getCommonManager().fetchNumber();
- if (typeFlag != CustomerType.COMMON) { // typeFlag中保存了非普通窗口的类型
- windowType = typeFlag; // 如果是非普通窗口调用普通窗口的方法.就恢复窗口类型
- typeFlag = CustomerType.COMMON; // typeFlag恢复为普通类型,让普通窗口不能执行当前代码块
- }
- customerType = CustomerType.COMMON;
- break;
- case EXPRESS:
- serviceNumber = instance.getExpressManager().fetchNumber();
- customerType = CustomerType.EXPRESS;
- serviceTime = Constants.MIN_SERVICE_TIME;// 快速客户时间为最小值
- break;
- case VIP:
- serviceNumber = instance.getVipManager().fetchNumber();
- customerType = CustomerType.VIP;
- break;
- }
- service(serviceNumber);// 统一出口
- }
- private void service(Integer serviceNumber) {
- String windowName = "第[" + windowID + "]号[" + windowType + "]窗口";
- sop(windowName + "开始获取 [" + customerType + "]任务!");
- if (serviceNumber != null) {
- sop(windowName + "开始为第[" + serviceNumber + "]号[" + customerType
- + "]客户服务");
- try {
- Thread.sleep(serviceTime);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- sop(windowName + "完成为第[" + serviceNumber + "]号[" + customerType
- + "]客户服务,总共耗时[" + serviceTime / 1000 + "]秒");
- } else {
- sop(windowName + "没有取到[" + customerType + "]任务! ");
- if ((flag % 2 == 0) && (windowType != CustomerType.COMMON)) {// 双重控制,只有vip和快速才能执行,且只能执行一次
- flag++; // 变为奇数,防止进入common的非普通窗口再次进入commom
- typeFlag = windowType;
- windowType = CustomerType.COMMON;
- startService(); // 执行完这个方法,customerType就变成common了,所以加了下一条代码
- customerType = null; // 防止下面if块代码执行两遍,(第一遍是在startService();里执行的)
- }
- if (customerType == CustomerType.COMMON) { // 如果是没有普通用户就暂停1s
- sop("正在空闲一秒");
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- flag = 0;// 无论非普通窗口找到或没有找到普通用户都让flag恢复初始值,以防止下一个非普通窗口因为flag=1而不能执行查找普通用户的代码
- }
- private static void sop(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
|