java代码银行业务调度系统的简单实现。

2025-11-09 00:54:11

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;

}

}

java代码银行业务调度系统的简单实现。

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(); 

}

java代码银行业务调度系统的简单实现。

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;

}

}

java代码银行业务调度系统的简单实现。

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;

}

java代码银行业务调度系统的简单实现。

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();

}

}

}

java代码银行业务调度系统的简单实现。

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

);

}

}

java代码银行业务调度系统的简单实现。

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号快速窗口正在获取快速任务

》》一直运行中....

java代码银行业务调度系统的简单实现。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢