-----------android培训、java培训、java学习型技术博客、期待与您交流! -----------
银行业务调度系统:
模拟实现银行业务调度系统:1,有6个业务窗口,4个普通窗口,1个快速窗口,1个VIP窗口。
客户比例对应为:6:3:1其中当快速窗口或VIP窗口空闲时,可以办理普通业务。
2,客户办理业务所需时间是随机的,有最大和最小值。快速客户办理用时为最小值。
3,客户每隔1秒产生。
思路:
根据现实生活的情况
1,客户通过取号机获取对应业务的号码。取号机是唯一的。
2,银行窗口通过叫号的形式为客户提供服务。
1,定义一个类产生号码
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 generateNewManager()
{
queueNumber.add(lastNumber);
return lastNumber++;
}
//定义函数,银行窗口获取号码,从集合中取出。
public synchronized Integer fetchServiceNumber()
{
Integer number = null;
if(queueNumber.size()>0)
number = queueNumber.remove(0);
return number;
}
}
2,定义一个取号机,根据客户不同的业务需求,产生不同类型的号码。
public class NumberMachine
{ //用来产生普通客户的号
private NumberManager commonManager = new NumberManager();
//用来产生快速客户的号
private NumberManager expressManager = new NumberManager();
//用来产生VIP客户的号
private NumberManager vipManager = new NumberManager();
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
//因为机器唯一,用单例模式产生。
private NumberMachine(){};
private static NumberMachine n = new NumberMachine();
public static NumberMachine getInstance()
{
return n;
}
}
3,用枚举定义用户类型
public enum CustomerType
{
COMMON,EXPRESS,VIP;
//将类型用中文表示。
public String toString()
{
switch(this){
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return "";
}
}
4,定义一个类装需要用到的常量。
public class Constants
{
public static int MAX_SERVICE_TIME = 10000;
public static int MIN_SERVICE_TIME = 1000;
public static int COMMON_CUSTOMER_INTERVAL_TIME =1;
}
5,定义银行窗口,取号服务。
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ServiceWindow
{ //初始服务窗口为普通类型,窗口号为1.
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()
{ //用线程池产生一个线程运行服务
ExecutorService thread = Executors.newSingleThreadExecutor();
thread.execute(new Runnable()
{
public void run()
{
while(true)
{ //判断客户类型,使对应的窗口进行服务。
switch(type)
{
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
});
}
//对普通客户的服务
private void commonService()
{
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在取号");
//获取普通窗口的客户号码
Integer num = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(num != null)
{
System.out.println(windowName+"正在为第"+num+"号普通客户服务");
//随机服务1到10秒
long beginTime = System.currentTimeMillis();
int serveTime = new Random().nextInt(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME)+1+Constants.MIN_SERVICE_TIME;
try
{
Thread.sleep(serveTime);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+num+"号"+"普通客户服务完毕"+"耗时"+costTime/1000+"秒");
}
else
{
System.out.println(windowName+"没有取到服务任务,休息1秒钟。");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
//对快速客户的服务
private void expressService()
{
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在取号");
//获取快速客户的号码
Integer num = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
if(num != null)
{
System.out.println(windowName+"正在为第"+num+"号"+type+"客户服务");
//快速服务的时间为固定的1秒
long costTime = Constants.MIN_SERVICE_TIME;
System.out.println(windowName+"为第"+num+"号"+type+"客户服务完毕"+"耗时"+costTime/1000+"秒");
}
else
{
System.out.println(windowName+"没有取到服务任务,正在获取普通客户。");
//当该窗口空闲时,协助普通窗口办理业务。
commonService();
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
//对VIP客户的服务
private void vipService()
{
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在取号");
//获取VIP客户的号码
Integer num = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
if(num != null)
{
System.out.println(windowName+"正在为第"+num+"号"+type+"客户服务");
//随机指定服务时间
long beginTime = System.currentTimeMillis();
int serveTime = new Random().nextInt(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME)+1+Constants.MIN_SERVICE_TIME;
try
{
Thread.sleep(serveTime);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+num+"号"+type+"客户服务完毕"+"耗时"+costTime/1000+"秒");
}
else
{
System.out.println(windowName+"没有取到服务任务,正在获取普通客户。");
commonService();
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
6,定义一个主类,对以上元素进行整合。
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass
{
public static void main(String[] args)
{ //产生4个普通窗口,进行服务
for(int x =1;x<5;x++)
{
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setWindowId(x);
commonWindow.start();
}
//创建一个快速窗口,进行服务
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();
//创建一个VIP窗口,进行服务
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
//通过定时器,每隔1秒产生一个普通客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable()
{
public void run(){
Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println("第"+number+"号普通客户正在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit.SECONDS);
//通过定时器,每隔2秒产生一个快速客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println("第"+number+"号快速客户正在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,
TimeUnit.SECONDS);
//通过定时器,每隔6秒产生一个VIP客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println("第"+number+"号vip客户正在等待服务");
}
},
0
,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,
TimeUnit.SECONDS);
}
}
-----------android培训、java培训、java学习型技术博客、期待与您交流! -----------