该项目模拟银行业务调度系统,听过张老师的分析后,有了思路,就好理解了。
银行分为普通窗口,快速窗口,VIP窗口,业务窗口办理业务是根据号码机器里面的
号来办的,所以有没有人来办业务,业务窗口服务看号码机器里面有没有号来判断。
号码机器里面又包含了3个产生号码的箱子,普通箱产生普通服务号,
快速箱产生快速服务号,VIP箱产生VIP服务号。
所以项目中就出现了3个类:
NumberManager类,用来产生号码:提供generateNewManager()和fetchServiceNumber()方法
分别用来在箱子里产生号码和取号码。
NumberMachine类,用来管理3个号码箱子,因为只有3个号码箱子为3个类型的窗口服务,
所以NumberMachine类要采用单例的模式实现,并且提供取3种箱子的方法。
public class NumberMachine
{
private static NumberMachine instance = new NumberMachine();
private NumberManager commonManager = new NumberManager();
private NumberManager expressManager = new NumberManager();
private NumberManager vipManager = new NumberManager();
public NumberManager getCommonManager()
{
return commonManager;
}
public NumberManager getExpressManager()
{
return expressManager;
}
public NumberManager getVipManager()
{
return vipManager;
}
private NumberMachine()
{
}
public static NumberMachine getInstance()
{
return instance;
}
}
ServiceWindow服务窗口类,因为只有3种类型的窗口,所以要写个CustomerType枚举类,
用来表示3种服务窗口的类型:
public enum CustomerType
{
COMMON,EXPRESS,VIP;
public String toString()
{
switch(this)
{
case COMMON: return "普通";
case EXPRESS: return "快速";
case VIP: return name();
}
return null;
}
}
服务窗口类里面有setType和setWindowId两个方法用来设置本窗口的类型和窗口号。
用start方法启动线程池来启动窗口服务,根据服务类型的不同做相应的处理,
普通服务窗口从普通箱子里取号码,快速窗口从快速箱子里取号码,VIP窗口从VIP箱子里取号码。
快速窗口和VIP窗口完成自己的服务后,看普通箱子里有没有业务了,有还完成普通箱子里的业务。
public class ServiceWindow
{
private CustomerType type = CustomerType.COMMON;
private int windowId = 1;
public void setType(CustomerType type)
{
this.type = type;
}
public void setWindowId(int windowId)
{
this.windowId = windowId;
}
public void start()
{
Executors.newSingleThreadExecutor().execute(new Runnable()
{
public void run()
{
while (true)
{
switch (type)
{
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
default:
break;
}
}
}
});
}
看类图:
主程序产生6个服务窗口和3个线程,模拟3个号码箱产生普通,快速,VIP三种类型的服务号码。
public static void main(String[] args)
{
for(int i=1; i<5; i++)
{
ServiceWindow commonwindow = new ServiceWindow();
commonwindow.setWindowId(i);
commonwindow.start();
}
ServiceWindow expresswindow = new ServiceWindow();
expresswindow.setType(CustomerType.EXPRESS);
expresswindow.start();
ServiceWindow vipwindow = new ServiceWindow();
vipwindow.setType(CustomerType.VIP);
vipwindow.start();
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable()
{
public void run()
{
Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println(number+"号-普通客户等待服务");
}},
0,
1,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable()
{
public void run()
{
Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println(number+"号-快速客户等待服务");
}},
0,
2,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable()
{
public void run()
{
Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println(number+"号-VIP客户等待服务");
}},
0,
6,
TimeUnit.SECONDS);
}
运行程序:银行开始营业拉0-0
1号-普通客户等待服务
1号-快速客户等待服务
1号-VIP客户等待服务
第2号普通窗口正在获取任务
第2号普通窗口为第1个普通客户服务
第1号普通窗口正在获取任务
第1号普通窗口没有取到任务,休息1秒钟
第3号普通窗口正在获取任务
第3号普通窗口没有取到任务,休息1秒钟
第1号VIP窗口正在获取任务
第1号VIP窗口为第1个VIP客户服务
第4号普通窗口正在获取任务
第1号快速窗口正在获取任务
第4号普通窗口没有取到任务,休息1秒钟
第1号快速窗口为第1个快速客户服务
………………………………………………………………
………………………………………………………………