黑马程序员_银行业务调度系统

<a href="http://www.itheima.com"  target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!

银行业务调度系统

 

模拟实现银行业务调度系统逻辑,具体需求如下:

Ø                银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口.

Ø                有三种对应类型的客户:VIP客户,快速客户(办理如交水电费,电话费等业务).

Ø                异步随机生成各种类型的户,生成各类型客户的概率比例为:

VIP客户:普通客户:快速客户 = 1:6:3

Ø                客户办理业务有最大时间和最小时间,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务时间为最小值.

Ø                各类型客户在其对应窗口按顺序依次办理业务.

Ø                当VIP6号窗口和快速(5号)窗口,没有客户等待办理业务时,这两个窗口可以处理普通窗口的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务.

Ø                随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置

Ø                不要求实现GUI,只考虑系统逻辑实现,可以通过log方式展现程序运行.

 

项目分析:

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

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

     由于有三类客户,每类客户的号码编排都是独立的,所以采用一个管理三种号码和管理器,而这个号码管理器在系统中只能有一个因此设成单例

     服务窗口每次都去找号码管理器取当前要服务的号

     类图:


代码实现: (注:以下代码并非与类图中类名一致)

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Random;

importjava.util.concurrent.Executors;

importjava.util.concurrent.TimeUnit;

 

classNumberManager

{

     private int lastNumber = 1;;

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

 

     // 产生号码

     public synchronized Integer generateNewManager()

     {

         // 向集合中存入号码

         queueNumber.add(lastNumber);

         returnlastNumber++;

     }

 

     public synchronized Integer fetchServiceNumber()

     {

         // 取各集合中的第一个号,并删除.

         if (queueNumber.size() > 0)

              returnqueueNumber.remove(0);

         else

              return null;

     }

}

 

// 服务窗口类型枚举,也可看作是顾客类型,它们是对应的

enumServiceWindowType

{

     COMMON, EXPRESS,VIP;

 

     // 覆盖toString()方法

     public String toString()

     {

         switch (this)

         {

              caseCOMMON:

                   return"普通";

              caseEXPRESS:

                   return"快速";

              caseVIP:

                   return name();

         }

         return null;

     }

}

 

// 服务窗口类

classServiceWindow

{

     private final static int MAX_SERVICE_TIME = 10000;//业务处理最长时间毫秒

     private final static int MIN_SERVICE_TIME = 1000;

     private ServiceWindowTypetype = ServiceWindowType.COMMON;//当每一次生成窗口实例时,得到窗口的类型,该处设为普通窗口

     private int windowId = 1;

     //外部调用setType给窗口类型赋值

     public void setType(ServiceWindowType type)

     {

         this.type = type;

     }

     //外部调用窗口编号,总共6个窗口1-4号为普通,5号快速,6号为VIP

     public void setWindowId(int windowId)

     {

         if (windowId >= 1 && windowId <=6)

              this.windowId = windowId;

         else

         {

              //银行不存在第七个窗口,从新赋值

              this.windowId = 1;

         }

     }

 

     // 普通服务

     public void commonService()

     {

         System.out.println(windowId +"号" +type +"窗口" +"获取"

                   + ServiceWindowType.COMMON +"窗口业务.....");

         Integer number = NumberMachine.getInstance().getCommonManager()

                   .fetchServiceNumber();

         if (number ==null)//number为null表示没有客户

         {

              System.out.println(windowId +"号" +type +"窗口" +"获取"

                       + ServiceWindowType.COMMON +"窗口业务失败!");

              if (type.equals(ServiceWindowType.COMMON))

              {

                   System.out.println(windowId +"号" +type + "窗口休息1秒!");

                   try

                   {

                       Thread.sleep(1000);

                   }

                   catch (InterruptedException e)

                   {

                       e.printStackTrace();

                   }

              }

         }

         else

         {

              long beginTime = System.currentTimeMillis();//当前系统时间毫秒(业务开始办理的时间)

              int maxRand =MAX_SERVICE_TIME -MIN_SERVICE_TIME;

              int serviceTime =new Random().nextInt(maxRand) + 1

                       + MIN_SERVICE_TIME;

              try

              {

                   Thread.sleep(serviceTime);

              }

              catch (InterruptedException e)

              {

                   e.printStackTrace();

              }

              long endTime = System.currentTimeMillis();//业务结束的时间

              System.out.println(windowId +"号" +type +"窗口正在为" + number +"号"

                       + ServiceWindowType.COMMON +"客户服务!" +"耗时"

                       + (endTime - beginTime) /1000 + "秒");

         }

     }

 

     // 快速服务

     public void expressService()

     {

         System.out.println("----"+windowId +"号" +type +"窗口" +"获取"

                   + ServiceWindowType.EXPRESS +"窗口业务.....");

         Integer number = NumberMachine.getInstance().getExpressManager()

                   .fetchServiceNumber();

         if (number ==null)

         {

              System.out.println("----"+windowId +"号" +type + "窗口" +"获取"

                       + ServiceWindowType.EXPRESS +"窗口业务失败!");

              commonService();

         }

         else

         {

              try

              {

                   Thread.sleep(MIN_SERVICE_TIME);

              }

              catch (InterruptedException e)

              {

                   e.printStackTrace();

              }

              System.out.println("----"+windowId +"号" +type + "窗口正在为" + number +"号"

                       + type +"客户服务!" +"耗时" +MIN_SERVICE_TIME / 1000 +"秒");//快速窗口根据项目要求为最小值(时间..MIN_SERVICE_TIME / 1000)

         }

 

     }

 

     // VIP服务

     public void vipService()

     {

         System.out.println("====" +windowId +"号" +type +"窗口" +"获取"

                   + ServiceWindowType.VIP +"窗口业务.....");

         Integer number = NumberMachine.getInstance().getVipManager()

                   .fetchServiceNumber();

         if (number ==null)

         {

              System.out.println("====" +windowId +"号" +type +"窗口" +"获取"

                       + ServiceWindowType.VIP +"窗口业务失败!");

              commonService();

         }

         else

         {

              long beginTime = System.currentTimeMillis();

              int maxRand =MAX_SERVICE_TIME -MIN_SERVICE_TIME;

              int serviceTime =new Random().nextInt(maxRand) + 1

                       + MIN_SERVICE_TIME;//取1001-10000之间的的随机数

              try

              {

                   Thread.sleep(serviceTime);

              }

              catch (InterruptedException e)

              {

                   e.printStackTrace();

              }

              long endTime = System.currentTimeMillis();

              System.out.println("====" +windowId +"号" +type +"窗口正在为" + number +"号"

                       + type +"客户服务!" +"耗时" + (endTime - beginTime) / 1000

                       + "秒");

         }

 

     }

 

     public void start()

     {

         //创建线程

         Executors.newSingleThreadExecutor().execute(new Runnable()

         {

              public void run()

              {

                   System.out.println(windowId +"号" +type + "业务窗口开启!");

                   while (true)

                   {

                       switch (type)

                       {

                            caseCOMMON:

                                 commonService();

                                 break;

                            caseEXPRESS:

                                 expressService();

                                 break;

                            caseVIP:

                                 vipService();

                                 break;

                       }

                   }

              }

         });

     }

}

 

// 管理号码的机器

classNumberMachine

{

     //单例设计,只存在一个实例对象

     private static NumberMachine instance =new NumberMachine();

    

     private NumberMachine()

     {

     }

 

     public static NumberMachine getInstance()

     {

         returninstance;

     }

     //三个实例分别为不同的客户类,它们里面的成员lastNumber会各自++,分别自增

     private NumberManagercommonManager =new NumberManager();//普通号

     private NumberManagerexpressManager =new NumberManager();//快速窗口号

     private NumberManagervipManager =new NumberManager();// VIP

     //封装,以便外部访问

     public NumberManager getCommonManager()

     {

         returncommonManager;

     }

 

     public NumberManager getExpressManager()

     {

         returnexpressManager;

     }

 

     public NumberManager getVipManager()

     {

         returnvipManager;

     }

}

//程序入口

public class Bank

{

     public static void main(String[] args)

     {

         //开启4个普通窗口,"工作人员开始叫号"

         for (int i = 1; i < 5; i++)

         {

              ServiceWindow commonWindow = new ServiceWindow();

              commonWindow.setWindowId(i);

              commonWindow.setType(ServiceWindowType.COMMON);

              commonWindow.start();

         }

         //开启一个快速窗口

         ServiceWindow expressWindow = new ServiceWindow();

         expressWindow.setWindowId(5);

         expressWindow.setType(ServiceWindowType.EXPRESS);

         expressWindow.start();

         //VIP窗口

         ServiceWindow vipWindow = new ServiceWindow();

         vipWindow.setWindowId(6);

         vipWindow.setType(ServiceWindowType.VIP);//设置窗口类型

         vipWindow.start();

 

         //创建线程并定时运行

         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable()

         {

              public void run()

              {

                   Integer number =NumberMachine.getInstance().getCommonManager()

                            .generateNewManager();

                   System.out.println(number +"号" + ServiceWindowType.COMMON

                            + "客户在等待....");

              }

         }, 0, 1, TimeUnit.SECONDS);//产生普通客户,每隔一秒钟

 

         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable()

         {

              public void run()

              {

                   Integer number =NumberMachine.getInstance()

                            .getExpressManager().generateNewManager();

                   System.out.println(number +"号" + ServiceWindowType.EXPRESS

                            + "客户在等待.......");

              }

         }, 0, 3, TimeUnit.SECONDS);//产生办理快速业务的客户每隔3秒钟

 

         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable()

         {

              public void run()

              {

                   Integer number =NumberMachine.getInstance().getVipManager()

                            .generateNewManager();

                   System.out.println(number +"号" + ServiceWindowType.VIP

                            + "客户在等待.......");

              }

         }, 0, 6, TimeUnit.SECONDS);//产生VIP客户每隔6秒钟

 

     }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值