`

黑马程序员_面试题_对银行业务调度系统总结

 
阅读更多

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

1.         首先我们要先建立一个号码管理器;

里面有取号动作(获取号码的动作),和存储号码的动作;

这时就会用到集合,通过集合的方式将取出来的号码进行存储;

//      产生客户号码;并且加到集合中;

         public synchronized Integer generateNewNumber(){

                   queueNumbers.add(++lastNumber);

                   return lastNumber;

         }

//      取到我们最先添加进去的客户号码;

         public synchronized Integer fetchNumber(){

                   if(queueNumbers.size()>0){

                            return (Integer)queueNumbers.remove(0);

                   }else{

                            return null;

                   }

         }

                                         

因为它queueNumbers.remove(0)的返回类型是元素,所以;就具有获取集合中的元素功能。

2.         我们要设计一个单例模式,从一个机器上取出三类号码;通过三类号码来获取集合中的元素,也可以在集合中产生元素;

3.         通过枚举类来获取对象的名称;

public enum CustomerType {

                       COMMON,EXPRESS,VIP;

                       public String toString(){

                            String name = null;

                            switch(this){

                            case COMMON:

                                     name = "普通";

                                     break;

                            case EXPRESS:

                                     name = "快速";

                                     break;

                            case VIP:

//                                  枚举常量的名称,这里返回就是vip

                                     name = name();

                                     break;

                            }

                            return name;

                       }

}

4.         每产生一个窗口,我们都会启动开启窗口的线程;

public void start(){

建立一个线程;执行只有一个参数,这里面就是线程;

                                          Executors.newSingleThreadExecutor().execute(

                                               new Runnable(){

                                                        public void run(){

                                          //下面这种写法的运行效率低,最好是把whilecase下面

                                                                 while(true){

                                                                           switch(type){

                                                                                    case COMMON:

                                                                                             commonService();

                                                                                             break;

                                                                                    case EXPRESS:

                                                                                             expressService();

                                                                                             break;

                                                                                    case VIP:

                                                                                             vipService();

                                                                                             break;

                                                                           }

                                                                 }

                                                        }

                                               }

                                     );

5.         线程里面的执行方法解析;

private void commonService(){

默认的是第1号,普通窗口;type的值,就是枚举里面的ToString里面的值;

String windowName = "" + number + "" + type + "窗口";      

System.out.println(windowName + "开始获取普通任务!");

产生对象获取号码;

Integer serviceNumber = NumberMachine.getInstance()

.getCommonManager().fetchNumber();        

if(serviceNumber != null ){

System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");

获取serviceTime时间;serviceTime010秒之间随机产生;

int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;

int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;

                                     try {

                                               Thread.sleep(serviceTime);

                                     } catch (InterruptedException e) {

                                               e.printStackTrace();

                                     }       

System.out.println(windowName + "完成为第" + serviceNumber +

              "号普通客户服务,总共耗时" + serviceTime/1000 + "");

//获取到的号码要是为空的话;                   

}else{

System.out.println(windowName + "没有取到普通任务,正在空闲一秒");              

                                     try {

                                               Thread.sleep(1000);

                                     } catch (InterruptedException e) {

                                               e.printStackTrace();

                                     }                                   

                            }

                                 }

6.         客户拿到号码代码解析

//普通客户拿号

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                                          new Runnable(){

                       public void run(){

//从机器中产生一个号码;

Integer serviceNumber = NumberMachine.getInstance().

getCommonManager().generateNewNumber();

//拿到号码;

System.out.println("" + serviceNumber + "号普通客户正在等待服务!");                      

                   }

                   },

                0,

Constants.COMMON_CUSTOMER_INTERVAL_TIME,

TimeUnit.SECONDS);

7.         银行系统里面用到的知识点总结;

1、集合;

2、同步代码块;

3、单例模式;

4、枚举类

51.5的新特性线程池;包括定时线程,和不定时线程两种;

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics