银行业务调度系统
总结:线程通过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();模拟用户的添加)