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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王林涛 中级黑马   /  2013-8-6 00:24  /  1493 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王林涛 于 2013-8-6 19:17 编辑

package com.isoftstone.interview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
/*
* 建立服务窗口类
*/
public class ServiceWindow {
//号码管理器所对应的窗口不确定,所以要定义一个变量,这时就需要设置一个枚举类.
private CustomerType type = CustomerType.COMMON;
//定义窗口号码
private int WindowId = 1;
//获取其set方法,来设置窗口
public void setType(CustomerType type) {
  this.type = type;
}
public void setWindowId(int windowId) {
  WindowId = windowId;
}
//服务窗口开始方法,这里是一个线程
public void start(){
  //建立线程池,这里只需要一个线程,然后调用执行方法,传入线程对象new Runnable
  Executors.newSingleThreadExecutor().execute(new Runnable(){
   //Runnble对象实现了Runnable接口,并覆盖run方法
   public void run(){
    //覆盖run方法就是为了不停的取号
    while(true){
//     if(type == CustomerType.COMMON)
//     //然后去找机器要一个号码管理器
//     NumberMachine.getInstance().getCommonManager();
//     else if(type == CustomerType.EXPRESS){
//      NumberMachine.getInstance().getExpressManager();
//     }
//     else if(type == CustomerType.VIP){
//      NumberMachine.getInstance().getVipManager();
//     }
//     break;
   //这里写成Switch语句,switch语句效率比if else if 语句效率高
     switch(type){
      case COMMON://一般写枚举都要加上前缀,就这个地方特殊 应该写成:case Customer.CoMMON;
       //定义一个变量windowName
       String windowName = "第"+WindowId+"号"+type+"窗口";
       System.out.println("正在获取任务");
       //当拿到所属客户类型的号码后,然后服务窗口开始叫号
       Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
       if(number != null){
        //开始时间
        long beginTime = System.currentTimeMillis();
        //定义最大随机时间
        int maxRandomTime = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
        /*
         * Random此类的实例用于生成伪随机数流.
         * 建立随机数对象new Random()
         * 方法nextInt()是指返回下一个伪随机数.
         */
        //让随机数的范围定义在 1 - 10000之间.
        long serviceTime = new Random().nextInt(maxRandomTime)+1+Constants.MIN_SERVICE_TIME;
        try {
         Thread.sleep(serviceTime);
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
        //服务消耗时间
        long costTime = System.currentTimeMillis() - beginTime;
        System.out.println(windowName+"为"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
       }else{
        System.out.println("没有取到任务,先休息一秒钟");
       }
       break;
      case EXPRESS:
       break;
      case VIP:
       break;
     }
    }
   }
  });
}
}
------------------------------------------------------------------------------------------------------------------------------------
此为张孝祥老师银行调度系统中的课程内容,怎么把上述类抽取称为commonService(普通客户服务)类.
抽取的时候主要是选择那一块内容?我见张老师抽取后是不包括内部类的,而我抽取后,怎么包括了内部类.求解决!!!
谢谢!

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

2 个回复

倒序浏览
抽取后,把方法是放到内部类的外边的,老师第一抽取的时候,也在内部类类中,老师又移动了一下,放到了外边。和start()方法并列。

public void start() {
                Executors.newSingleThreadExecutor().execute(new Runnable() {
                        public void run() {
                                while (true) {
                                        switch (type) {
                                        case COMMON:
                                                commonService();
                                                break;
                                        case EXPRESS:
                                                expressService();
                                                break;
                                        case VIP:
                                                vipService();
                                                break;
                                        }

                                }
                        }
                });
        }

        public void commonService() {
                String windowName = "第" + windowId + "号" + type + "窗口";
               
                Integer number = NumberMachine.getInstance().getCommonManage()
                                .fetchServiceNumber();
                System.out.println(windowName + "开始获取服务任务");
                if (number != null) {
                        System.out.println(windowName + "为第" + number + "个" + "普通"
                                        + "客户服务");
                        long beginTime = System.currentTimeMillis();
                        int maxRand = Constants.MAX_SERVICE_TIME
                                        - Constants.MIN_SERVICE_TIME;

                        long serveTime = new Random().nextInt(maxRand + 1
                                        + Constants.MIN_SERVICE_TIME);
                        try {
                                Thread.sleep(serveTime);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        long closeTime = System.currentTimeMillis() - beginTime;
                        System.out.println(windowName + "为第" + number + "个" + "普通"
                                        + "客户完成服务,耗时:" + (closeTime / 1000) + "秒");
                } else {
                        System.out.println(windowName + "没有取到任务,先休息1秒");
                        try {
                                Thread.sleep(1000);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }
       

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
forward 发表于 2013-8-6 15:07
抽取后,把方法是放到内部类的外边的,老师第一抽取的时候,也在内部类类中,老师又移动了一下,放到了外边 ...

谢谢,再次感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马