---------------------------------------- JavaEE+云物联、期待与您交流!---------------------------------------------
<pre name="code" class="java">/**
*银行业务调度系统,主要分为三个部分:
*1,第一部分是取号模组,包括一个取号机和三个号码管理模块。
*2,第二部分是服务模组,包括服务类型模块、时间模块、服务分配模块。
*3,第三部分是启动模组,用于启动服务模组和取号模组。
*/
import java.util.*;
import java.util.concurrent.*;
//启动模块,用于启动服务窗口和号码机。
public class Bank
{
public static void main(String[] args)
{
for(int i=1;i<5;i++)
{
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setServiceWindow(CustomerType.COMMON,i);
commonWindow.start();
}
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setServiceWindow(CustomerType.EXPRESS,1);
expressWindow.start();
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setServiceWindow(CustomerType.VIP,1);
vipWindow.start();
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
int number = NumberMachine.getInstance()
.getCommonManager().generateServiceNumber();
System.out.println("第"+number
+"位申请普通服务的顾客正在等待。");
}
},
0,
ServiceTime.CUSTOMER_APPLY_FOR_TIME,
TimeUnit.SECONDS
);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
int number = NumberMachine.getInstance()
.getExpressManager().generateServiceNumber();
System.out.println("第"+number
+"位申请快速服务的顾客正在等待。");
}
},
0,
ServiceTime.CUSTOMER_APPLY_FOR_TIME*2,
TimeUnit.SECONDS
);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
int number = NumberMachine.getInstance()
.getVipManager().generateServiceNumber();
System.out.println("第"+number
+"位申请VIP服务的顾客正在等待。");
}
},
0,
ServiceTime.CUSTOMER_APPLY_FOR_TIME*6,
TimeUnit.SECONDS
);
}
}
//号码生成模块,用于获取、保存、分配号码。
class NumberManager
{
private List<Integer> queueNumber = new ArrayList<Integer>();
private int lastNumber = 1;
public synchronized int generateServiceNumber()
{
queueNumber.add(lastNumber);
return lastNumber++;
}
public synchronized Integer fetchServiceNumber()
{
Integer currentNumber = null;
if(queueNumber.size()>0)
currentNumber = queueNumber.remove(0);
return currentNumber;
}
}
//号码机,用于管理三个号码生成模块。
class NumberMachine
{
private static NumberMachine instance = new NumberMachine();
private NumberMachine(){}
public static NumberMachine getInstance()
{
return instance;
}
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;
}
}
//服务类型模块,用于定义服务窗口的类型。
enum CustomerType
{
COMMON,EXPRESS,VIP;
public String toString()
{
switch(this)
{
case COMMON:
return "普通服务";
case EXPRESS:
return "快速服务";
case VIP:
return name()+"服务";
}
return null;
}
}
//时间模块,用于定义一些时间。
class ServiceTime
{
public static final int MIN_SERVICE_TIME = 1000;
public static final int MAX_SERVICE_TIME = 10000;
public static final int CUSTOMER_APPLY_FOR_TIME = 1;
public static int fecthServiceTime(CustomerType customerType)
{
switch (customerType)
{
case COMMON:
return new Random().nextInt(MAX_SERVICE_TIME-MIN_SERVICE_TIME)
+1+MIN_SERVICE_TIME;
case EXPRESS:
return MIN_SERVICE_TIME;
case VIP:
return new Random().nextInt(MAX_SERVICE_TIME-MIN_SERVICE_TIME)
+1+MIN_SERVICE_TIME;
}
return 0;
}
}
//服务窗口模块,用于提供本窗口的服务功能。
class ServiceWindow
{
private CustomerType type = CustomerType.COMMON;
private int windowId = 1;
//此处的数组是为了判断,其它两个窗口是否需要为普通服务窗口帮忙。
private static Integer[] queueWindow = {0,0,0,0};
public void setServiceWindow(CustomerType type,int windowId)
{
this.type = type;
this.windowId = windowId;
}
public void start()
{
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run()
{
int i = 1;
switch(type)
{
case COMMON:
while (i<1000)
{
commonService();
i++;
}
break;
case EXPRESS:
while (i<500)
{
expressService();
i++;
}
break;
case VIP:
while (i<100)
{
vipService();
i++;
}
break;
}
}
});
}
private void commonService()
{
String windowName = "第"+windowId+"号"+type+"窗口";
Integer number = NumberMachine.getInstance().getCommonManager()
.fetchServiceNumber();
System.out.println(windowName+"正在获取普通业务服务。");
if(number!=null)
{
queueWindow[windowId-1] = 1;
long startTime = System.currentTimeMillis();
try
{
System.out.println(windowName+"正在为第"+number
+"位办理普通业务的顾客服务。");
Thread.sleep(ServiceTime.fecthServiceTime(type));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowName+"为第"+number
+"位办理普通业务的顾客服务完毕,共耗时"
+((System.currentTimeMillis()-startTime)/1000)+"秒");
queueWindow[windowId-1] = 0;
}
else
{
System.out.println(windowName
+"没有取到普通业务服务,休息1秒钟。");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private void expressService()
{
String windowName = "第"+windowId+"号"+type+"窗口";
Integer number = NumberMachine.getInstance()
.getExpressManager().fetchServiceNumber();
System.out.println(windowName+"正在获取快速业务服务。");
if(number!=null)
{
long startTime = System.currentTimeMillis();
try
{
System.out.println(windowName+"正在为第"+number
+"位办理快速业务的顾客服务。");
Thread.sleep(ServiceTime.fecthServiceTime(type));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowName+"为第"+number
+"位办理快速业务的顾客服务完毕,共耗时"
+((System.currentTimeMillis()-startTime)/1000)+"秒");
}
else
{
if(Arrays.asList(queueWindow).contains(0))
{
System.out.println(windowName
+"没有取到快速业务服务,休息1秒钟。");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
System.out.println(windowName+"没有取到快速业务服务。");
commonService();
}
}
}
private void vipService()
{
String windowName = "第"+windowId+"号"+type+"窗口";
Integer number = NumberMachine.getInstance()
.getVipManager().fetchServiceNumber();
System.out.println(windowName+"正在获取VIP业务服务。");
if(number!=null)
{
long startTime = System.currentTimeMillis();
try
{
System.out.println(windowName+"正在为第"+number
+"位办理VIP业务的顾客服务。");
Thread.sleep(ServiceTime.fecthServiceTime(type));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowName+"为第"+number
+"位办理VIP业务的顾客服务完毕,共耗时"
+((System.currentTimeMillis()-startTime)/1000)+"秒");
}
else
{
if(Arrays.asList(queueWindow).contains(0))
{
System.out.println(windowName
+"没有取到VIP业务服务,休息1秒钟。");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
System.out.println(windowName+"没有取到VIP业务服务。");
commonService();
}
}
}
}
---------------------------------------- JavaEE+云物联、期待与您交流!---------------------------------------------