银行业务调度
第一步:创建一个号码管理器
publicclass NumberManager {
//号码管理器
privateint lastNumber = 1;
//排队队列
privateList<Integer> queueNumber = new ArrayList<Integer>();
//产生新的号码
//由于是多个线程操作同一个数据必须加上互斥锁
publicsynchronized Integer generateManager(){
queueNumber.add(lastNumber);
returnlastNumber++;
}
//窗口取号码的方法
publicsynchronized Integer fetchServiceNumber(){
//避免空指针异常
Integernumber = null;
if(queueNumber.size()>0){
number= queueNumber.remove(0);
}
returnnumber;
}
}
第二步:创建一个号码机器,生成号码管理器
publicclass NumberMachine {
//号码产生器,产生三个号码管理器
privateNumberManager commanManager = new NumberManager();
privateNumberManager expressManager = new NumberManager();
privateNumberManager vipManager = new NumberManager();
publicNumberManager getCommanManager() {
returncommanManager;
}
publicNumberManager getExpressManager() {
returnexpressManager;
}
publicNumberManager getVipManager() {
return vipManager;
}
//由于只有一个机器,用单例模式,饿汉式
privateNumberMachine(){};
publicstatic NumberMachine getInstance(){
returnnumberMachine;
}
privatestatic NumberMachine numberMachine = new NumberMachine();
}
第三步:创建窗口
publicclass ServieWindow {
//服务窗口
//窗口类型使用枚举
privateCustomType type = CustomType.COMMON;
//定义窗口号
privateint windowId = 1;
publicvoid setType(CustomType type) {
this.type= type;
}
publicvoid setWindowId(int windowId) {
this.windowId= windowId;
}
//开始叫号
publicvoid start(){
//该窗口使用多线程来循环叫号
//使用线程池创建
Executors.newSingleThreadExecutor().execute(
newRunnable(){
publicvoid run(){
while(true){
//根据窗口类型取号
switch(type){
caseCOMMON:
commonService();
break;
caseEXPRESS:
expressService();
break;
caseVIP:
vipService();
break;
}
}
}
}
);
}
privatevoid commonService() {
StringwindowName = "第"+windowId+"号"+type+"窗口";
Integernumber = NumberMachine.getInstance().getCommanManager().fetchServiceNumber();
System.out.println(windowName+"正在获取服务");
if(number != null){
System.out.println(windowName+ "为第" + number+"个"+type+"客户服务");
//服务时间
longbeginTime = System.currentTimeMillis();
intMaxRand = Constants.MaxService_TIME-Constants.MinService_TIME;
//获得服务时间
longserverTime = new Random().nextInt(MaxRand)+1+Constants.MinService_TIME;
try{
Thread.sleep(serverTime);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
longcostTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+ "为第" + number+"个"+"普通"+"客户服务,花费时间+"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到服务任务,先吸支烟!");
try{
Thread.sleep(1000);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
privatevoid expressService() {
StringwindowName = "第"+windowId+"号"+type+"窗口";
Integernumber = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
System.out.println(windowName+"正在获取服务");
if(number!= null){
System.out.println(windowName+ "为第" + number+"个"+type+"客户服务");
//服务时间
longbeginTime = System.currentTimeMillis();
//intMaxRand = Constants.MaxService_TIME-Constants.MinService_TIME;
//获得服务时间
//longserverTime = new Random().nextInt(MaxRand)+1+Constants.MinService_TIME;
try{
Thread.sleep(Constants.MinService_TIME);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
longcostTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+ "为第" + number+"个"+type+"客户服务,花费时间+"+costTime/1000+"秒");
}else{
System.out.println(windowName+ "没有取到服务任务!");
commonService();
}
}
privatevoid vipService() {
StringwindowName = "第"+windowId+"号"+type+"窗口";
Integernumber = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
System.out.println(windowName+"正在获取服务");
if(number!= null){
System.out.println(windowName+ "为第" + number+"个"+type+"客户服务");
//服务时间
longbeginTime = System.currentTimeMillis();
intMaxRand = Constants.MaxService_TIME-Constants.MinService_TIME;
//获得服务时间
long serverTime = newRandom().nextInt(MaxRand)+1+Constants.MinService_TIME;
try{
Thread.sleep(serverTime);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
longcostTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+ "为第" + number+"个"+type+"客户服务,花费时间+"+costTime/1000+"秒");
}else{
System.out.println(windowName+ "没有取到服务任务!");
commonService();
}
}
}
第四步:测试
publicstatic void main(String[] args) {
for(inti = 1;i<5;i++){
ServieWindowcommonWindow = new ServieWindow();
commonWindow.setWindowId(i);
commonWindow.start();
}
ServieWindowexpressWindow = new ServieWindow();
expressWindow.setType(CustomType.EXPRESS);
expressWindow.start();
ServieWindowvipWindow = new ServieWindow();
vipWindow.setType(CustomType.VIP);
vipWindow.start();
//创建一个调度线程池
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
newRunnable(){
publicvoid run(){
//普通窗口控制
//取号
Integernumber = NumberMachine.getInstance().getCommanManager().generateManager();
System.out.println(number+ "号普通客户等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
newRunnable(){
publicvoid run(){
//快速窗口控制
Integernumber = NumberMachine.getInstance().getExpressManager().generateManager();
System.out.println(number+ "号快速客户等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
newRunnable(){
publicvoid run(){
//vip窗口控制
Integernumber = NumberMachine.getInstance().getVipManager().generateManager();
System.out.println(number+ "号vip客户等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,
TimeUnit.SECONDS);
}
}
第五步:一般把静态常数封装成类,以及一些类
publicclass Constants {
publicstatic int MaxService_TIME = 10000;
publicstatic int MinService_TIME = 1000;
publicstatic int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
publicenum CustomType {
COMMON,EXPRESS,VIP;
publicString toString(){
switch(this){
caseCOMMON:
return"普通";
caseEXPRESS:
return"快速";
caseVIP:
returnname();
}
returnnull;
}
}