java代码银行业务调度系统的简单实现。
1、首先创建一个类来模拟到银行的客户,我称之为客户模拟器。
package com.zyq.bank;
import java.util.ArrayList;
import java.util.List;
/**
* 客户模拟器
* @author zyq
*时间:2016年11月25日下午10:44:34
*
*/
public class NumberManager {
private int lastNumber=1;
List<Integer> queueNumber=new ArrayList<Integer>();
//每次来一个银行客户产生一个新的号码
public synchronized Integer generateNewNumber(){
queueNumber.add(lastNumber);
return lastNumber++;
}
//窗口每次叫到一个客户号就把此号从数组中移除
public synchronized Integer fetchServiceNumber(){
Integer number=null;
if(queueNumber.size()>0){
queueNumber.remove(0);
return lastNumber;
}
return number;
}
}

2、创建一个类模拟银行职员叫号:我称之为取号器。
package com.zyq.bank;
/**
* 取数模拟
* @author zyq
*时间昆脂:2016年11月25日下午10:43:41
*
*/
public class NumberMachine {
//三种撤关客户类别:普通客户 ,快速客户,vip客户
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;
}
private static NumberMachine instance=new NumberMachine();
}

3、创建耍胆科一个枚举类,表明三类客户。
package com.zyq.bank;
/**
*
* 枚举类
*时间:2016年11月25日下午10:43:16
*
*/
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
switch(this){
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return null;
}
}

4、创建一个常量类,方便时间记录。
package com.zyq.bank;
/**
* 常量类
*时间:2016年11月25日下午10:42:03
*
*/
public class Constants {
public static int MIN_SERVICE_TIME=1000;
public static int MAX_SERVICE_TIME=10000;
public static int COMMON_CUSTOMER_INTERVIEW=1;
}

5、新建类模拟银行职员服务:服务窗口。
package com.zyq.bank;
import java.util.Random;
import java.util.concurrent.Executors;
/**
* 服务窗口
* @author zyq
*时间:2016年11月25日下午10:46:56
*
*/
public class ServiceWindow {
private CustomerType type=CustomerType.COMMON;
private int windowId =1;
/***** 此处设置set方法而不是有参数的构造方法 方便复用 ********/
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public void star() {
//此处jdk5以后记忆 仅建立一个线程池 获取客户号
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
while(true){
//亦可以用if 但是没有switvh效率高
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 number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(number != null){
System.out.println(windowName+"正在为"+number+"普通客户服务");
long beginTime=System.currentTimeMillis();
int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
//产生【1000,10000】的随机数 模拟服务的时间
long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
//服务消耗的时间
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"号普通客户服务"+",耗时"+costTime/1000 +"秒");
}else{
System.out.println(windowName+"没有取到任务,先休息一下喝口水");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void expressService() {
Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
String windowName="第"+ windowId +"号" +type +"窗口";
System.out.println(windowName+"正在获取快速任务");
if(number != null){
System.out.println(windowName+"正在为"+number+"号"+type+"快速客户服务");
long beginTime=System.currentTimeMillis();
//int maxRandom=Constants.MAX_SERVICE_TIME-;
//产生【1000,10000】的随机数 模拟服务的时间
//long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
//服务消耗的时间
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"号"+type+"客户服务"+costTime/1000 +"秒");
}else{
System.out.println(windowName+"没有取到任务,继续为普通客户服务");
commonService();
}
}
private void vipService() {
Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
String windowName="第"+ windowId +"号" +type +"窗口";
System.out.println(windowName+"正在获取VIP任务");
if(number != null){
System.out.println(windowName+"正在为"+number+"号"+type+"客户服务");
long beginTime=System.currentTimeMillis();
int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
//产生【1000,10000】的随机数 模拟服务的时间
long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
//服务消耗的时间
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"号"+type+"客户服务"+costTime/1000 +"秒");
}else{
System.out.println(windowName+"没有取到任务,继续为普通用户服务,就别喝水了");
commonService();
}
}
}

1、写一个测试类来测试代码的准确性。
package com.zyq.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 测试类
* @author zyq
*时间:2016年11月25日下午11:48:37
*
*/
public class MainClass {
public static void main(String[] args) {
//产生4个普通窗口
for (int i = 1; i < 5; i++) {
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.star();
}
//产生一个快速窗口
ServiceWindow expressWindow=new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.star();
//产生一个VIP窗口
ServiceWindow vipWindow=new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.star();
//普通客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
public void run() {
Integer number=NumberMachine.getInstance().getCommonManager().generateNewNumber();
System.out.println(number+"号普通客户正在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVIEW,
TimeUnit.SECONDS
);
//快速客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
public void run() {
Integer number=NumberMachine.getInstance().getExpressManager().generateNewNumber();
System.out.println(number+"号快速客户正在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVIEW * 6,
TimeUnit.SECONDS
);
//VIP客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
public void run() {
Integer number=NumberMachine.getInstance().getVipManager().generateNewNumber();
System.out.println(number+"号VIP客户正在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVIEW * 2,
TimeUnit.SECONDS
);
}
}

2、测试结果如下:
第1号普通窗口正在获取普通任务
第1号普通窗口没有取到任务,先休息一下喝口水
第2号普通窗口正在获取普通任务
第2号普通窗口没有取到任务,先休息一下喝口水
第3号普通窗口正在获取普通任务
第3号普通窗口没有取到任务,先休息一下喝口水
第4号普通窗口正在获取普通任务
第4号普通窗口没有取到任务,先休息一下喝口水
第1号VIP窗口正在获取VIP任务
第1号VIP窗口没有取到任务,继续为普通用户服务,就别喝水了
第1号VIP窗口正在获取普通任务
第1号VIP窗口没有取到任务,先休息一下喝口水
第1号快速窗口正在获取快速任务
第1号快速窗口没有取到任务,继续为普通客户服务
第1号快速窗口正在获取普通任务
第1号快速窗口没有取到任务,先休息一下喝口水
1号普通客户正在等待服务
1号快速客户正在等待服务
1号VIP客户正在等待服务
第1号普通窗口正在获取普通任务
第1号普通窗口正在为2普通客户服务
第1号快速窗口正在获取快速任务
》》一直运行中....
