黑马程序员--基础复习2012.8.8 银行调度系统

来源:互联网 发布:照片回忆录制作软件 编辑:程序博客网 时间:2024/05/22 02:20
---------------------- android培训、java培训、期待与您交流! ----------------------

       银行调度系统

              号码管理器,不断的产生号码,模拟随机客户。

              有三类客户,需要三个号码管理器各自管理一类用户,同时被一个机器管理。

              窗口依次叫号,获取要被服务的号码。

l    NumberManager类

Ø  定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。

Ø  定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。

 

/*

 * 号码管理器

 */

publicclass NumberManager {

    privateintlastNumber=1;

    private List<Integer>queueNumber =new ArrayList<Integer>();

   

    publicsynchronized Integer generateNewManager(){

       queueNumber.add(lastNumber);

       returnlastNumber++;

    }

   

    publicsynchronized Integer fetchServiceNumber(){

       Integer number = null;

       if(!queueNumber.isEmpty())

           number = queueNumber.remove(0);

       return number;

    }

}

 

l  NumberMachine

Ø  定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。

Ø  将NumberMachine类设计成单例。

 

/*

 *单例设计一个取号机,可以产生三种号码管理器

 */

publicclass NumberMachine {

    private NumberManagercommonManager =new NumberManager();

    private NumberManagerexpressManager =new NumberManager();

    private NumberManagervipManager = new NumberManager();

    public NumberManager getCommonManager() {

       returncommonManager;

    }

    public NumberManager getExpressManager() {

       returnexpressManager;

    }

    public NumberManager getVipManager() {

       returnvipManager;

    }

   

    private NumberMachine(){}

    publicstatic NumberMachine getInstance(){

       returninstance;

    }

   

    privatestatic NumberMachineinstance =new NumberMachine();

}

 

CustomerType枚举类

Ø  系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。

 

package cn.lcf.bank;

 

publicenum CustomerType {

    COMMON,EXPRESS,VIP;

 

    @Override

    public String toString() {

       switch (this) {

       caseCOMMON:

           return"普通";

       caseEXPRESS:

           return"快速";

       caseVIP:

           return name();

 

       default:

           break;

       }

       returnnull;

    }

   

}

ServiceWindow类

Ø  定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。

Ø  定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。

 

public class ServiceWindow {

       //窗口类型

       privateCustomerType type = CustomerType.COMMON;

       //窗口号

       privateint windowID = 1;

      

       publicCustomerType getType() {

              returntype;

       }

       publicvoid setType(CustomerType type) {

              this.type= type;

       }

       publicvoid setWindowID(int windowID) {

              this.windowID= windowID;

       }

       publicvoid start(){

              Executors.newSingleThreadExecutor().execute(newRunnable(){

 

                     @Override

                     publicvoid run() {

                            while(true){

                                   switch(type) {

                                   case  COMMON:

                                          commonservice();

                                          break;

                                   case  EXPRESS:

                                          expressservice();

                                          break;

                                   case  VIP:

                                          vipservice();

                                          break;

                                   default:

                                          break;

                                   }

                            }

                     }

                    

              });

       }

       publicvoid commonservice(){

              StringwindowName = "第" +windowID +"号" + type + "窗口";

              System.out.println(windowName+ "正在获取任务");

              Integernumber = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();

              if(number!=null){

                     longbeginTime = System.currentTimeMillis();

                     intmaxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;

                     longserverTime = new Random().nextInt(maxRand) + 1 + Constants.MIN_SERVICE_TIME;

                     try{

                            Thread.sleep(serverTime);

                     }catch (InterruptedException e) {

                            e.printStackTrace();

                     }

                     longcostTime = (System.currentTimeMillis()-beginTime)/1000;

                     System.out.println(windowName+ "为第" +number +"个" +"普通客户完成服务,耗时"+ costTime+ "秒");

                    

              }else{

                     System.out.println(windowName+"没有获取到任务,休息一秒");

                     try{

                            Thread.sleep(1000);

                     }catch (InterruptedException e) {

                            e.printStackTrace();

                     }

              }

       }

       …………

 

MainClass类

Ø  用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。

Ø  接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码

Ø  /**

 * 测试类

 */

public class MainClass {

       publicstatic void main(String[] args) {

              //新建五个普通窗口

              for(inti=1;i<5; i++){

                     //创建默认的ServiceWindow

                     ServiceWindowcommonWindow = new ServiceWindow();

                     //设置窗口序号

                     commonWindow.setWindowID(i);

                     //启动窗口服务

                     commonWindow.start();

              }

              //创建窗口

              ServiceWindowvipwindow = new ServiceWindow();

              //将窗口类型设为VIP

              vipwindow.setType(CustomerType.VIP);

              //启动窗口服务

              vipwindow.start();

              //创建窗口

              ServiceWindowexpresswindow = new ServiceWindow();

              //将窗口类型设为EXPRESS

              expresswindow.setType(CustomerType.EXPRESS);

              //启动窗口服务

              expresswindow.start();

              //创建线程添加普通用户

              Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                            newRunnable() {

                                  

                                   @Override

                                   publicvoid run() {

                                          //

                                        System.out.println(NumberMachine.getInstance().getCommonManager().generateNewManager()+"号,普通客户等待服务");

                                   }

                            },

                            0,

                            Constants.COMMON_CUSTOMER_INTERVAL_TIME,

                            TimeUnit.SECONDS);

              //创建线程添加快速用户

              Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                            newRunnable() {

                                  

                                   @Override

                                   publicvoid run() {

                                          System.out.println(NumberMachine.getInstance().getExpressManager().generateNewManager()+"号,快速客户等待服务");                                     

                                   }

                            },

                            0,

                            Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,

                            TimeUnit.SECONDS);

              //创建线程添加VIP用户

              Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                            newRunnable() {

                                  

                                   @Override

                                   publicvoid run() {

                                          System.out.println(NumberMachine.getInstance().getVipManager().generateNewManager()+"号,VIP等待服务");                                     

                                   }

                            },

                            0,

                            Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,

                            TimeUnit.SECONDS);

       }

 

}


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

----------------------详细请查看:http://edu.csdn.net/heima