A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 hanxing 于 2014-11-9 16:00 编辑

张老师在他的7k项目中分别为三个类型的窗口写了三个方法,其中这三个方法代码大部分是重复,所以我想能不能把他们融合成一个通用方法呢,经过一番奋战,终于改出来了,比想象中的要难点,期间出了很多个bug,还是被我一个一个解决了,有点小激动.为了满足一下我的虚荣心;P,分享给大家.如果大家有更简洁易懂的方法或者是意见,,欢迎讨论.
  1. import java.util.Random;
  2. import java.util.concurrent.Executors;

  3. public class ServiceWindow {
  4.         int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
  5.         int serviceTime = new Random().nextInt(maxRandom)
  6.                         + Constants.MIN_SERVICE_TIME;// 设置默认办理业务的时间
  7.         int flag = 0; // 控制非普通窗口执行普通任务的标志
  8.         // 1.打开转换窗口类型代码的钥匙2.用来存储非普通"变"为普通窗口之前类型/ 3.阻止普通窗口的锁
  9.         CustomerType typeFlag = CustomerType.COMMON;
  10.         private CustomerType windowType;
  11.         private CustomerType customerType;
  12.         private int windowID = 1;

  13.         public void setWindowType(CustomerType windowType) {
  14.                 this.windowType = windowType;
  15.         }

  16.         public void setWindowID(int windowID) {
  17.                 this.windowID = windowID;
  18.         }

  19.         public void start() {
  20.                 Executors.newSingleThreadExecutor().execute(new Runnable() {
  21.                         public void run() {
  22.                                 while (true)
  23.                                         startService();
  24.                         }
  25.                 });
  26.         }

  27.         private void startService() {
  28.                 Integer serviceNumber = null;
  29.                 NumberMachine instance = NumberMachine.getInstance();// 获取取号机的实例
  30.                 switch (windowType) {
  31.                 case COMMON:// common入口
  32.                         serviceNumber = instance.getCommonManager().fetchNumber();
  33.                         if (typeFlag != CustomerType.COMMON) { // typeFlag中保存了非普通窗口的类型
  34.                                 windowType = typeFlag; // 如果是非普通窗口调用普通窗口的方法.就恢复窗口类型
  35.                                 typeFlag = CustomerType.COMMON; // typeFlag恢复为普通类型,让普通窗口不能执行当前代码块
  36.                         }
  37.                         customerType = CustomerType.COMMON;
  38.                         break;
  39.                 case EXPRESS:
  40.                         serviceNumber = instance.getExpressManager().fetchNumber();
  41.                         customerType = CustomerType.EXPRESS;
  42.                         serviceTime = Constants.MIN_SERVICE_TIME;// 快速客户时间为最小值
  43.                         break;
  44.                 case VIP:
  45.                         serviceNumber = instance.getVipManager().fetchNumber();
  46.                         customerType = CustomerType.VIP;
  47.                         break;
  48.                 }
  49.                 service(serviceNumber);// 统一出口
  50.         }

  51.         private void service(Integer serviceNumber) {
  52.                 String windowName = "第[" + windowID + "]号[" + windowType + "]窗口";
  53.                 sop(windowName + "开始获取 [" + customerType + "]任务!");
  54.                 if (serviceNumber != null) {
  55.                         sop(windowName + "开始为第[" + serviceNumber + "]号[" + customerType
  56.                                         + "]客户服务");
  57.                         try {
  58.                                 Thread.sleep(serviceTime);
  59.                         } catch (InterruptedException e) {
  60.                                 e.printStackTrace();
  61.                         }
  62.                         sop(windowName + "完成为第[" + serviceNumber + "]号[" + customerType
  63.                                         + "]客户服务,总共耗时[" + serviceTime / 1000 + "]秒");
  64.                 } else {
  65.                         sop(windowName + "没有取到[" + customerType + "]任务!   ");
  66.                         if ((flag % 2 == 0) && (windowType != CustomerType.COMMON)) {// 双重控制,只有vip和快速才能执行,且只能执行一次
  67.                                 flag++; // 变为奇数,防止进入common的非普通窗口再次进入commom
  68.                                 typeFlag = windowType;
  69.                                 windowType = CustomerType.COMMON;
  70.                                 startService(); // 执行完这个方法,customerType就变成common了,所以加了下一条代码
  71.                                 customerType = null; // 防止下面if块代码执行两遍,(第一遍是在startService();里执行的)
  72.                         }
  73.                         if (customerType == CustomerType.COMMON) { // 如果是没有普通用户就暂停1s
  74.                                 sop("正在空闲一秒");
  75.                                 try {
  76.                                         Thread.sleep(1000);
  77.                                 } catch (InterruptedException e) {
  78.                                         e.printStackTrace();
  79.                                 }
  80.                         }
  81.                 }
  82.                 flag = 0;// 无论非普通窗口找到或没有找到普通用户都让flag恢复初始值,以防止下一个非普通窗口因为flag=1而不能执行查找普通用户的代码
  83.         }

  84.         private static void sop(Object obj) {
  85.                 System.out.println(obj);
  86.         }
  87. }
复制代码





评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
不轻易 + 2 Nice~~
杨佳名 + 1 赞一个!

查看全部评分

16 个回复

倒序浏览
还没看到7K面试题,先Mark一下!
回复 使用道具 举报
貌似不靠7K了,,,只考到反射
回复 使用道具 举报
sk0806 发表于 2014-10-30 16:13
貌似不靠7K了,,,只考到反射

恩,听坛友们说过,就当练算法题了
回复 使用道具 举报
挺多啊,写的。
回复 使用道具 举报

在Eclipse中看的还好
回复 使用道具 举报
还没看到,先赞一个
回复 使用道具 举报
楼主很不错哦~~
回复 使用道具 举报

谢谢大神的支持.黑马币我最喜欢了:lol
回复 使用道具 举报
hanxing 发表于 2014-11-1 08:49
在Eclipse中看的还好

我是看的视频,毕老师的。
回复 使用道具 举报
hanxing 发表于 2014-11-1 08:49
在Eclipse中看的还好

我是看的视频,毕老师的。
回复 使用道具 举报
chenggong 发表于 2014-11-3 17:40
我是看的视频,毕老师的。

啊.原来还有这么多版本啊

点评

现在去黑马了吧  发表于 2014-12-29 22:45
回复 使用道具 举报
hanxing 发表于 2014-11-3 17:45
啊.原来还有这么多版本啊

对啊。是咱们老师推荐看的视频。网页上有。
回复 使用道具 举报
顶一个!!!!
回复 使用道具 举报
chenggong 发表于 2014-11-3 17:53
对啊。是咱们老师推荐看的视频。网页上有。

今天面试完了,成绩好低,我是半路杀过来的,毕老师的视频没有看全,看到名额不多了,就急了,大家千万要引以为戒!!!
要毕老师的视频从第一个开始看就好了,20天的时间,写博客花了一星期,期间还得写帖子回帖子赚积分,看7k视频还花了一天.没几天看视频了,哎...
回复 使用道具 举报
hanxing 发表于 2014-11-3 19:05
今天面试完了,成绩好低,我是半路杀过来的,毕老师的视频没有看全,看到名额不多了,就急了,大家千万要引以为 ...

你面试时还有多少名额啊。没关系,再好好准备。加油。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马