黑马程序员------银行业务调度系统(2)

来源:互联网 发布:wifi监控摄像头软件 编辑:程序博客网 时间:2024/04/29 07:35
 

---------------------- Android 培训、java 培训 、期待与您交流! ----------------------

银行业务调度系统

=================================================

//CustomerType

package com.itcast.study.Bank;

 

public enum CustomerType {

   COMMON,EXPRESS,VIP;          //定义的3种客户

   public String toString(){

      String name = null;

      switch(this){

      case COMMON:

         name = "普通";

         break;

      case EXPRESS:

         name = "快速";

         break;

      case VIP:

         name = name();

         break;

      }

      return name;

   }

}

 

 

=================================================

//Constants

package com.itcast.study.Bank;

 

public class Constants {

   public static int MAX_SERVICE_TIME = 10000; //10秒

   public static int MIN_SERVICE_TIME = 1000; //1秒

  

   /*1秒钟产生一个普通客户*/ 

   public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;   

}

 

 

 

==================================================

//NumberManager

package com.itcast.study.Bank;

 

import java.util.ArrayList;

import java.util.List;

 

public class NumberManager {

     private int lastNumber = 0;

     private List queueNumbers = new ArrayList();

     //客户取号

     public synchronized Integer generateNewNumber(){

         queueNumbers.add(++lastNumber);

         return lastNumber;

     }

     //窗口叫号

     public synchronized Integer fetchNumber(){

         if(queueNumbers.size()>0){

              return (Integer)queueNumbers.remove(0);

         }else{

              return null;

         }

     }

}

 

===================================================

//NumberMachine

package com.itcast.study.Bank;

 

public class NumberMachine {

   //用单例模式来管理号码管理器。

   private NumberMachine(){}

   private static NumberMachine instance = new NumberMachine();

   public static NumberMachine getInstance(){

      return instance;

   }

  

   private NumberManager commonManager = new NumberManager();//创建一个普通号码管理器

   private NumberManager expressManager = new NumberManager();//创建一个快速号码管理器

   private NumberManager vipManager = new NumberManager();//创建一个VIP号码管理器

   //对外提供一个访问的方法。

   public NumberManager getCommonManager() {

      return commonManager;

   }

   public NumberManager getExpressManager() {

      return expressManager;

   }

   public NumberManager getVipManager() {

      return vipManager;

   }

  

}

 

=================================================

//ServiceWindow

package com.itcast.study.Bank;

 

import java.util.Random;

import java.util.concurrent.Executors;

 

public class ServiceWindow {

 

      private CustomerType type = CustomerType.COMMON;//窗口类型,默认是普通窗口

      private int number = 1;//窗口号默认值为1号

 

      public CustomerType getType() {

           return type;

      }

 

      public void setType(CustomerType type) {

           this.type = type;

      }

 

      public void setNumber(int number) {

           this.number = number;

      }

 

      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 = "第" + number + "号" + type + "窗口";

           System.out.println(windowName + "正在获取服务任务");

           Integer serviceNumber = NumberMachine.getInstance().getCommonManager()

                      .fetchNumber();

           if (serviceNumber != null) {

                 System.out.println(windowName + "正在为第" + serviceNumber + "号客户服务");

                 int maxRandom = Constants.MAX_SERVICE_TIME

                            - Constants.MIN_SERVICE_TIME;

                 int serviceTime = new Random().nextInt(maxRandom) + 1

                            + Constants.MIN_SERVICE_TIME;

 

                 try {

                      Thread.sleep(serviceTime);

                 } catch (InterruptedException e) {

                      e.printStackTrace();

                 }

                 System.out.println(windowName + "为第" + serviceNumber + "号客户服务,耗时:"

                            + serviceTime / 1000 + "秒");

           } else {

                 System.out.println(windowName + "没有取到服务任务");

                 try {

                      Thread.sleep(1000);

                 } catch (InterruptedException e) {

                      e.printStackTrace();

                 }

           }

      }

//快速窗口为客户服务

      private void expressService() {

           Integer serviceNumber = NumberMachine.getInstance().getExpressManager()

                      .fetchNumber();

           String windowName = "第" + number + "号" + type + "窗口";

           System.out.println(windowName + "");

           if (serviceNumber != null) {

                 System.out.println(windowName + "正在为第" + serviceNumber + "号客户服务");

                 int serviceTime = Constants.MIN_SERVICE_TIME;

                 try {

                      Thread.sleep(serviceTime);

                 } catch (InterruptedException e) {

                      e.printStackTrace();

                 }

                 System.out.println(windowName + "为第" + serviceNumber + "号客户服务,耗时:"

                            + serviceTime / 1000 + "秒");

           } else {

                 System.out.println(windowName + "没有取到服务任务");

                 commonService();

           }

      }

//VIP窗口为客户服务

      private void vipService() {

 

           Integer serviceNumber = NumberMachine.getInstance().getVipManager()

                      .fetchNumber();

           String windowName = "第" + number + "号" + type + "窗口";

           System.out.println(windowName + "");

           if (serviceNumber != null) {

                 System.out.println(windowName + "正在为第" + serviceNumber + "号客户服务");

                 int maxRandom = Constants.MAX_SERVICE_TIME

                            - Constants.MIN_SERVICE_TIME;

                 int serviceTime = new Random().nextInt(maxRandom) + 1

                            + Constants.MIN_SERVICE_TIME;

                 try {

                      Thread.sleep(serviceTime);

                 } catch (InterruptedException e) {

                      e.printStackTrace();

                 }

                 System.out.println(windowName + "为第" + serviceNumber + "号客户服务,耗时:"

                            + serviceTime / 1000 + "秒");

           } else {

                 System.out.println(windowName + "没有取到服务任务");

                 commonService();

           }

      }

}

=================================================

//MainClass

 

package com.itcast.study.Bank;

 

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

 

public class MainClass {

 

   public static void main(String[] args) {

      // 创建4个窗口

      for (int i = 1; i < 5; i++) {

         ServiceWindow window = new ServiceWindow();

         window.setNumber(i);

         window.start();

      }

 

      // 创建一个快速窗口

      ServiceWindow expressWindow = new ServiceWindow();

      expressWindow.setType(CustomerType.EXPRESS);

      expressWindow.start();

 

      // 创建一个VIP窗口

      ServiceWindow vipWindow = new ServiceWindow();

      vipWindow.setType(CustomerType.VIP);

      vipWindow.start();

 

      // 普通客户取号

      Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

         public void run() {

            Integer serviceNumber = NumberMachine.getInstance()

                   .getCommonManager().generateNewNumber();

            System.out.println("第" + serviceNumber + "号普通客户等待服务");

         }

      }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS);

 

      // 快速客户取号

      Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

         public void run() {

            Integer serviceNumber = NumberMachine.getInstance()

                   .getExpressManager().generateNewNumber();

            System.out.println("第" + serviceNumber + "号快速客户等待服务");

         }

      }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2, TimeUnit.SECONDS);

 

      // VIP客户取号

      Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

         public void run() {

            Integer serviceNumber = NumberMachine.getInstance()

                   .getVipManager().generateNewNumber();

            System.out.println("第" + serviceNumber + "号vip客户等待服务");

         }

      }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, TimeUnit.SECONDS);

   }

 

}

 

 

 

 

 

 

 

---------------------- Android 培训、java 培训 、期待与您交流! ----------------------

原创粉丝点击