本帖最后由 Bule丶 于 2014-8-9 22:00 编辑
- 首先,第一个是管理号码的类
- /*********************************/
- package com.hans.bank1;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 号码管理者
- * @author hans
- *
- */
- public class NumberManager {
- private List<Integer> queueNumber = new ArrayList<Integer>(); //号码队列
- private int lastNumber = 1; //上一个号码 客户拿了一个号,得把号码送回去吧,然后在等待 号码是从1开始的
- //客户取号的方法
- public Integer generateNewNumber(){
- queueNumber.add(lastNumber);
- return lastNumber++;
- }
- /**
- * 窗口叫号用的方法
- * @return
- */
- public Integer fetchServiceNumber(){
- Integer number = null;
- if(queueNumber.size() > 0){
- number = queueNumber.remove(0);
- }
- return number;
- }
- }
- //接下来是管理号码的类的管理者,相当于是一个机器,管理号码的类是软件
- /******************************/
- package com.hans.bank1;
- /**
- * 号码管理者所在的机器
- * @author hans
- *
- */
- public class NumberMachine {
- //机器肯定是单例模式的
- private static NumberMachine manchine = new NumberMachine();
- private NumberMachine(){
- }
- public static NumberMachine getInstance(){
- return manchine;
- }
- private NumberManager commonManager = new NumberManager(); //普通客户号码管理
- private NumberManager expressManager = new NumberManager(); //快速客户号码管理
- private NumberManager vipManager = new NumberManager(); //vip客户号码管理
- /**
- * get方法
- * @return
- */
- public NumberManager getCommonManager() {
- return commonManager;
- }
- public NumberManager getExpressManager() {
- return expressManager;
- }
- public NumberManager getVipManager() {
- return vipManager;
- }
- }
- /*******************************/
- 接下来到了银行窗口,但是窗口肯定有类型,就用到了枚举
- package com.hans.bank1;
- /**
- * 窗口的类型,客户的类型
- * @author hans
- *
- */
- public enum CustomerType {
- COMMON,EXPRESS,VIP;
- public String toString(){
- switch (this) {
- case COMMON:
- return "普通";
- case EXPRESS:
- return "快速";
- case VIP:
- return name();
- }
- return null;
- }
- }
- /***************************/
- //窗口类
- package com.hans.bank1;import java.util.Random;
- import java.util.concurrent.Executors;
- /**
- * 银行窗口
- * @author hans
- *
- */
- public class ServiceWindow {
- //窗口应该有第几号 ,当前窗口的级别 是普通呢,还是快速的呢,还是vip的呢 所以我们需要2个属性 id 和 类型
- private int windowId = 1; //窗口的编号
- private CustomerType type = CustomerType.COMMON; //窗口的类型
- /**
- * set方法 服务窗口默认是普通类型,可以set为别的类型 窗口编号也不是固定的 也需要set方法
- * @param windowId
- */
- public void setWindowId(int windowId) {
- this.windowId = windowId;
- }
- public void setType(CustomerType type) {
- this.type = type;
- }
- //窗口开始服务的方法
- public void start(){
- Executors.newSingleThreadExecutor().execute(new Runnable(){
- @Override
- 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 number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();//取得号码队列里的前面的号码
-
- if(number != null){ //如果为null,代表没人人来
- System.out.println(windowName + "开始服务第" + number + "号普通客户!");
- long beginTime = System.currentTimeMillis();
- int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; //规定的最小1000毫秒和最大10000毫秒时间差 9000毫秒 也就是随机毫秒数
- long maxServiceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; //此处,最小服务一秒,最大10秒 单位是毫秒
- try {
- new Thread().sleep(maxServiceTime); //线程睡眠的毫秒数 也就是服务的时长
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- long costTime = System.currentTimeMillis() - beginTime; //总共用时的时间 毫秒数
- System.out.println(windowName + "服务普通客户用时" + costTime/1000 + "秒!");
- }else{
- System.out.println(windowName + "没有取到任务,休息一秒钟!");
- try {
- new Thread().sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- /*
- * 快速用户窗口服务的方法
- */
- private void expressService(){
- String windowName = "第"+windowId+"号"+type+"窗口";
- System.out.println(windowName + "开始取得任务");
-
- Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();//取得号码队列里的前面的号码
-
- if(number != null){ //如果为null,代表没人人来
- System.out.println(windowName + "开始服务第" + number + "号" + type + "客户!");
- long beginTime = System.currentTimeMillis();
- try {
- new Thread().sleep(Constants.MIN_SERVICE_TIME); //线程睡眠的毫秒数 也就是服务的时长 快速窗口就1秒钟
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- long costTime = System.currentTimeMillis() - beginTime; //总共用时的时间 毫秒数
- System.out.println(windowName + "服务" + type + "客户用时" + costTime/1000 + "秒!");
- }else{
- System.out.println(windowName + "没有取到任务!");//快速窗口没有用户要去服务普通客户 不能休息
- commonService();
- }
- }
- /*
- * vip用户窗口服务的方法
- */
- private void vipService(){
- String windowName = "第"+windowId+"号"+type+"窗口";
- System.out.println(windowName + "开始取得任务");
-
- Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();//取得号码队列里的前面的号码
-
- if(number != null){ //如果为null,代表没人人来
- System.out.println(windowName + "开始服务第" + number + "号" + type + "客户!");
- long beginTime = System.currentTimeMillis();
- int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; //规定的最小1000毫秒和最大10000毫秒时间差 9000毫秒 也就是随机毫秒数
- long maxServiceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; //此处,最小服务一秒,最大10秒 单位是毫秒
- try {
- new Thread().sleep(maxServiceTime); //线程睡眠的毫秒数 也就是服务的时长
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- long costTime = System.currentTimeMillis() - beginTime; //总共用时的时间 毫秒数
- System.out.println(windowName + "服务" + type + "客户用时" + costTime/1000 + "秒!");
- }else{
- System.out.println(windowName + "没有取到任务!"); //vip窗口没有用户要去服务普通客户 不能休息
- commonService();
- }
- }
- }
- /************************************/
- 窗口用到了一些常量,比如要求规定的最大时间啊,最小时间啊,这个常量类
- package com.hans.bank1;
- /**
- * 一些用到的常量
- * @author hans
- *
- */
- public class Constants {
- final public static int MIN_SERVICE_TIME = 1000; //每个窗口最短服务时间
- final public static int MAX_SERVICE_TIME = 10000; //每个窗口最长服务时间
- final public static int INTERVAL_TIME = 1; //客户进入间隔时间
- }
- /********************/
- 接下来是测试类了
- package com.hans.bank1;
- import java.util.concurrent.Executors;
- import java.util.concurrent.TimeUnit;
- /**
- * 测试类
- * @author hans
- *
- */
- public class MainClass {
- /**
- * @param args
- */
- public static void main(String[] args) {
- /**
- * 6个窗口初始化
- */
- for (int i = 1; i < 5; i++) {
- ServiceWindow commonWindow = new ServiceWindow(); //4个普通窗口
- commonWindow.setWindowId(i); //set一下窗口id
- commonWindow.start(); //默认就是普通窗口 不用在set类型 开启服务
- }
- ServiceWindow expressWindow = new ServiceWindow(); //4个普通窗口
- expressWindow.setType(CustomerType.EXPRESS); //设置窗口类型 快速类型
- expressWindow.start(); //默开启服务
- ServiceWindow vipWindow = new ServiceWindow(); //4个普通窗口
- vipWindow.setType(CustomerType.VIP); //设置窗口类型 VIP类型
- vipWindow.start(); //开启服务
- /**
- * 客户初始化
- */
- //用线程池的计时器
- //生成的普通客户
- Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
- new Runnable() {
- @Override
- public void run() {
- Integer number = NumberMachine.getInstance().getCommonManager().generateNewNumber(); //生成普通客户
- System.out.println("第"+number+"位普通客户等待服务!");
- }
- },
- 0,
- Constants.INTERVAL_TIME,
- TimeUnit.SECONDS);
- //生成的快速客户
- Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
- new Runnable() {
- @Override
- public void run() {
- Integer number = NumberMachine.getInstance().getExpressManager().generateNewNumber(); //生成快速客户
- System.out.println("第"+number+"位快速客户等待服务!");
- }
- },
- 0,
- Constants.INTERVAL_TIME*3,
- TimeUnit.SECONDS);
- //生成的vip客户
- Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
- new Runnable() {
- @Override
- public void run() {
- Integer number = NumberMachine.getInstance().getVipManager().generateNewNumber(); //生成vip客户
- System.out.println("第"+number+"位vip客户等待服务!");
- }
- },
- 0,
- Constants.INTERVAL_TIME*6,
- TimeUnit.SECONDS);
- }
- }
复制代码
|
|