本文主要是介绍银行调度总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/*
NumberManager类:号码发生器
定义一个号码属性。
客户取号的方法。
服务窗口取号的方法。
防止多个方法访问同一数据,让其同步。
定义一个数组排队队列存储号码数组。
*/
//号码发生器
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;
}
}
/*
NumberMachine类:号码管理器
定义产生普通、快速、VIP号码属性。产生各自的方法。
产生自身的私有构造方法。修改自身单例设计模式.
*/
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(){}
private static NumberMachine instance=new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}
}
/*
ServiceWindow类:
开始执行取号的方法.通过Executors 产生一个线程池.
号码类型属性(通过枚举产生固有变量值).
*/
public class ServiceWindow {
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()
{
//通过启动一个线程来执行服务窗口
Executors.newSingleThreadExecutor().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+"窗口";
Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
System.out.println(windowName+"为第"+number+"个"+"普通"+"客户服务");
long beginTime=System.currentTimeMillis();
int maxRand=Constans.MAX_SERVICE_TIME - Constans.MIN_SERVICE_TIME;
long serviceTime=new Random().nextInt(maxRand)+1+Constans.MIN_SERVICE_TIME; //服务消耗的时间
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"个"+"普通"+"客户完成服务,耗时"+costTime/1000+"秒");
}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){
System.out.println(windowName+"为第"+number+"个"+type+"客户服务");
long beginTime=System.currentTimeMillis();
//int maxRand=Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;
//long serviceTime=new Random().nextInt(maxRand)+1+Constans.MIN_SERVICE_TIME; //服务消耗的时间
try {
Thread.sleep(Constans.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() {
String windowName="第"+windowId+"号"+type+"窗口";
Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
System.out.println(windowName+"为第"+number+"个"+type+"客户服务");
long beginTime=System.currentTimeMillis();
int maxRand=Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;
long serviceTime=new Random().nextInt(maxRand)+1+Constans.MIN_SERVICE_TIME; //服务消耗的时间
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
}else{
System.out.println(windowName+"沒有取到任務");
commonService(); //没任务为普通客户服务
}
}
}
这篇关于银行调度总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!