java面试题之银行业务调度系统

来源:互联网 发布:淘宝怎么买东西最划算 编辑:程序博客网 时间:2024/05/04 08:22

银行业务调度系统

总结:线程通过NumberMachine的NumberManager对象定时产生对应类型的客户,WindowService类根据窗口的类型通过NumberMachine的NumberManager对象获取号码并进行服务.两者通过产生号码和获取号码联系的.

 

实现步骤

1,创建一个NumberManager类.用于号码的管理

    定义一个号码计数器(int)和一个集合(用于存储号码)

    定义一个generateNumber()方法,用于产生号码(即增加计数器的值),并将号码存放在集合中.

    定义一个fetchNumber()方法,用于获取号码,从集合中第一个号码并移除(集合的remove()方法),并返回该号码.

注:这两个方法要加同步锁,防止产生号码的方法还没执行完,就取号.(没取着)

 

2,创建一个NumberMachine类,用于产生号码,因为只有一个对象设计成单例的

    定义3个NumberManager对象,分别对应着普通,快速,Vip的取号管理.

    将该类设计成单例模式.

 

3,创建一个CustomerType枚举,用于定义三种的客户

    定义三个元素,分别是Common,Express,Vip,并重写toString().

 

4,创建一个WindowService,用于管理窗口叫号和服务.

    定义一个窗口类型对象(Common),和窗口的编号(windoweId);并进行初始化.

    在构造函数中启动一个线程并一直运行(while(true)),run()方法中while中的代码是:获取当前窗口的类型:

若是Common,则通过NumberMachine对象的getCommo()方法返回NumberManager对象,获取该对象中的号码(fetchNumbe).并判断是否为空, 若不为空,则进行服务(服务时间用Thread.sleep()实现).服务时间随机,是的话,休息一秒.

若是Express,则通过NumberMachine对象的getExpress()方法返回NumberManager对象,获取该对象中的号码(fetchNumbe).并判断是否为空,若不为空,则进行服务(服务时间用Thread.sleep()实现).服务时间是1秒,若不为空则调用commonService()方法,为普通客户服务.

若是Vip,则通过NumberMachine对象的getVip()方法返回NumberManager对象,获取该对象中的号码(fetchNumbe).并判断是否为空,若不为空,则进行服务(服务时间用Thread.sleep()实现).服务时间是随机,若不为空则调用commonService()方法,为普通客户服务.

注:

Common和Vip的服务时间,是在最大值和最小值之间随机产生的.最大值和最小值可定义成一个类的静态常量,再进行获取.

 

5,创建测试类BankTest

     创建4个类型为Common的WindowService对象,windoweId递增.可通过循环进行创建.

     创建1个类型为Express的WindowService对象,windoweId不变.

创建1个类型为Vip的WindowService对象,windoweId不变.

创建三个定时器,定时为不同类型的用户添加客户.(通过NumberMachine.getInstance.getXxx().generateNumber();模拟用户的添加)