------- android培训、java培训、期待与您交流! ----------
模拟实现银行业务调度系统逻辑,具体需求如下:
1.取号机有三种客户类型取号,其每种客户取号的都具备当前取号数,和下一位服务号码所以将其封装成一个类,同种类型的客
户取号的数据都是共享的所以只能创建三个实例对象。
2.客户数量比例:普通客户:快速客户:VIP客户=6:3:1
其可以建立定时器来控制每种类型的客户比例,时间间隔为该比例或其倍数。
3.快速客户业务服务时间为1秒,其余业务服务时间为1到10秒随机。当快速服务窗口和VIP服务窗口没有办理相应业务时,其窗口
可以为普通客户服务
定义一个取号机:普通取号,快速取号,VIP取号都具备其功能。
package com.bank;
import java.util.ArrayList;
import java.util.List;
public class NumberManager {
private int LastNumber=1;
private List<Integer> queueNumber=new ArrayList<Integer>();
//两个方法的用于多线程所以要同步,否则会出现安全隐患
public synchronized Integer generateNewNumber()
//排队的号码,将每个号码存入一个集合方便叫号,并返回取号机当前取号的情况
{
queueNumber.add(LastNumber);
return LastNumber++;
}
public synchronized Integer fetchNumber()
//即将办理业务的号码,按照先进先出原理,最前面的先办理所以调用queueNumber集合remove(0)
{
if (queueNumber.size()>0)
{
return queueNumber.remove(0);
}
else
return null;
}
}
取号机客户类型:分为三种普通客户取号,快速客户取号和VIP客户取号,而且同一种类型的客户的排队号码是按顺序的,所以同种客户取号其中的数据时共享的,只能创建三个实例对象。
package com.bank;
public class NumberMachine {
private NumberManager commonManager=new NumberManager();//普通客户业务
private NumberManager expressManager=new NumberManager();//快速客户业务
private NumberManager VIpManager=new NumberManager();//VIP客户业务
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVIPManager() {
return VIpManager;
}
private NumberMachine(){}
private static NumberMachine instance=new NumberMachine();
public static NumberMachine getInstance()
{
return instance;
}
}
客户类型只有三种所以用枚举定义:
package com.bank;
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString()
{
String name=null;
switch(this)
//switch不仅可以传入int short byte 还可以把枚举传入作为参数,
{
case COMMON:
name="普通";
break;
case EXPRESS:
name="快速";
break;
case VIP:
name="VIP";
break;
}
return name;
}
}
窗口服务的最大时间和最小时间 都是常量所以用大写:
package com.bank;
public class constants {
public static int MAX_SERVICE_TIME=10;
public static int MIN_SERVICE_TIME=1;
}
服务窗口:
package com.bank;
import java.util.Random;
import java.util.concurrent.Executors;
//服务窗空的属性有服务客户类型,窗口号。开始服务方法
public class ServiceWindow {
private CustomerType Type=CustomerType.COMMON;
private int number=1;
public CustomerType getType() {
return Type;
}
public void setType(CustomerType type) {
Type = type;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public void start()
{
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run()
{
//判断窗口服务类型,进行相应服务
while (true) {//这样效率比较慢,建议把while放在case中
switch (Type) {
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
VipService();
break;
}
}
}
});
}
public void commonService() //普通服务
{
String windowNumber="第"+number+"号"+Type+"窗口";
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();
//获取普通窗口当前要服务的号码
System.out.println(windowNumber+"等待普通客户任务");
if (serviceNumber!=null)
{
System.out.println(windowNumber+"开始为第"+serviceNumber+"普通客户服务");
int time=new Random().nextInt(constants.MAX_SERVICE_TIME+1);
//为普通客户办理业务的时间是随机性的1秒到10秒
try
{
Thread.sleep(time*1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowNumber+"为第"+serviceNumber+"普通客户服务耗时"+time+"秒");
}
else
{
System.out.println(windowNumber+"没有普通客户任务,等待客户中");
try
{
Thread.sleep(1000);//没有客户等待一秒
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public void expressService() //快速服务
{
String windowNumber="第"+number+"号"+Type+"窗口";
Integer serviceNumber= NumberMachine.getInstance().getExpressManager().fetchNumber();
//获取快速窗口当前要服务的号码
System.out.println(windowNumber+"等待快速客户任务");
if (serviceNumber!=null)
{
System.out.println(windowNumber+"开始为第"+serviceNumber+"快速客户服务");
int time=constants.MIN_SERVICE_TIME;
//快速服务窗口的特点业务简单所以办理为一秒
try
{
Thread.sleep(time*1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowNumber+"为第"+serviceNumber+"快速客户服务耗时"+time+"秒");
}
else //如果没有快速客户则为普通客户服务
{
System.out.println(windowNumber+"没有快速客户任务");
commonService();
}
}
public void VipService() //VIP服务
{
String windowNumber="第"+number+"号"+Type+"窗口";
Integer serviceNumber = NumberMachine.getInstance().getVIPManager().fetchNumber();
//获取VIP窗口当前要服务的号码
System.out.println(windowNumber+"等待VIP客户任务");
if (serviceNumber!=null)
{
System.out.println(windowNumber+"开始为第"+serviceNumber+"VIP客户服务");
int time=new Random().nextInt(constants.MAX_SERVICE_TIME+1);
//为VIP办理业务的时间是随机性的1到10秒
try
{
Thread.sleep(time*1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowNumber+"为第"+serviceNumber+"VIP客户服务耗时"+time+"秒");
}
else //如果当前没有VIP客户也为普通客户服务
{
System.out.println(windowNumber+"没有VIP客户任务");
commonService();
}
}
}
验证类:
package com.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class mainClass {
public static void main(String[]args)
{
//普通窗口4个,快速窗口1个,VIP客户1个
for(int x=1;x<5;x++)
{
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setType(CustomerType.COMMON);
commonWindow.setNumber(x);
commonWindow.start();
}
ServiceWindow expressWindow=new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();
ServiceWindow vipWindow=new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
/*客户数量比例:普通客户:快速客户:VIP客户=6:3:1
所以普通客户每个1秒来一个,快速客户2秒来一个,VIP客户6秒来一个为每一种客户定义一个定时器*/
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
Integer number=NumberMachine.getInstance().getCommonManager().generateNewNumber();
System.out.println("第"+number+"位普通客户等待服务中");
}},
0,
1,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
Integer number=NumberMachine.getInstance().getExpressManager().generateNewNumber();
System.out.println("第"+number+"位快速客户等待服务中");
}},
0,
2,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
Integer number=NumberMachine.getInstance().getVIPManager().generateNewNumber();
System.out.println("第"+number+"位VIP客户等待服务中");
}},
0,
6,
TimeUnit.SECONDS);
}
}