黑马程序员11模拟实现银行业务调度系统

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

模拟实现银行业务调度系统逻辑,具体需求如下:


1.取号机有三种客户类型取号,其每种客户取号的都具备当前取号数,和下一位服务号码所以将其封装成一个类,同种类型的客
户取号的数据都是共享的所以只能创建三个实例对象。
2.客户数量比例:普通客户:快速客户:VIP客户=6:3:1
其可以建立定时器来控制每种类型的客户比例,时间间隔为该比例或其倍数。
3.快速客户业务服务时间为1秒,其余业务服务时间为1到10秒随机。当快速服务窗口和VIP服务窗口没有办理相应业务时,其窗口
可以为普通客户服务


定义一个取号机:普通取号,快速取号,VIP取号都具备其功能。


package com.bank;
import java.util.ArrayList;
import java.util.List;
public class NumberManager {

private int LastNumber=1;

private List queueNumber=new ArrayList();

//两个方法的用于多线程所以要同步,否则会出现安全隐患

public synchronized Integer generateNewNumber()

//排队的号码,将每个号码存入一个集合方便叫号,并返回取号机当前取号的情况

{

queueNumber.add(LastNumber);

return LastNumber++;

}

public synchronized Integer fetchNumber()

   //即将办理业务的号码,按照先进先出原理,最前面的先办理所以调用queueNumber集合remove(0)

{

if (queueNumber.size()>0)

{

return queueNumber.remove(0);

}

else

return null;

}

}


 

取号机客户类型:分为三种普通客户取号,快速客户取号和VIP客户取号,而且同一种类型的客户的排队号码是按顺序的,所以同种客户取号其中的数据时共享的,只能创建三个实例对象。

 

package com.bank;

 

public class NumberMachine {

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;

}

private NumberMachine(){}

private static NumberMachine instance=new NumberMachine();

public static NumberMachine getInstance()

{

return instance;

}

}


 

客户类型只有三种所以用枚举定义:

 

package com.bank;

 

public enum CustomerType {

COMMON,EXPRESS,VIP;

public String toString()

{

String name=null;

switch(this)

   //switch不仅可以传入int short byte 还可以把枚举传入作为参数,

{

  case COMMON:

    name="普通";

  break;

 

  case EXPRESS:

    name="快速";

  break;

 

  case VIP:

    name="VIP";

  break;

}

return name;

}

}


 

窗口服务的最大时间和最小时间 都是常量所以用大写:

 

package com.bank;

 

public class constants {

public static int MAX_SERVICE_TIME=10;

public static int MIN_SERVICE_TIME=1;

}



 

服务窗口:

 

package com.bank;

import java.util.Random;

import java.util.concurrent.Executors;

 

//服务窗空的属性有服务客户类型,窗口号。开始服务方法

public class ServiceWindow {

private CustomerType Type=CustomerType.COMMON;

private int number=1;

 

public CustomerType getType() {

return Type;

}

public void setType(CustomerType type) {

Type = type;

}

 

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

 

public void start()

{

Executors.newSingleThreadExecutor().execute(new Runnable(){

public void run()

{

//判断窗口服务类型,进行相应服务

while (true) {//这样效率比较慢,建议把while放在case中

switch (Type) {

 

case COMMON:

  commonService();

break;

 

case EXPRESS:

  expressService();

break;

 

case VIP:

  VipService();

break;

}

}

}

});

}

public void commonService()  //普通服务

{

  String windowNumber="第"+number+"号"+Type+"窗口";

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

             //获取普通窗口当前要服务的号码

  System.out.println(windowNumber+"等待普通客户任务");

 

if (serviceNumber!=null)

{

  System.out.println(windowNumber+"开始为第"+serviceNumber+"普通客户服务");

  int time=new Random().nextInt(constants.MAX_SERVICE_TIME+1);

     //为普通客户办理业务的时间是随机性的1秒到10秒

try 

{

  Thread.sleep(time*1000);

}

 catch (InterruptedException e) 

{

  e.printStackTrace();

}

  System.out.println(windowNumber+"为第"+serviceNumber+"普通客户服务耗时"+time+"秒");

}

else

{

  System.out.println(windowNumber+"没有普通客户任务,等待客户中");

try

 {

    Thread.sleep(1000);//没有客户等待一秒

 } 

catch (InterruptedException e)

 {

     e.printStackTrace();

 }

}

}

 

public void expressService()  //快速服务

{

  String windowNumber="第"+number+"号"+Type+"窗口";

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

              //获取快速窗口当前要服务的号码

  System.out.println(windowNumber+"等待快速客户任务");

 

if (serviceNumber!=null)

{

  System.out.println(windowNumber+"开始为第"+serviceNumber+"快速客户服务");

  int time=constants.MIN_SERVICE_TIME;

      //快速服务窗口的特点业务简单所以办理为一秒

try 

{

  Thread.sleep(time*1000);

 } 

catch (InterruptedException e) 

{

  e.printStackTrace();

 }

  System.out.println(windowNumber+"为第"+serviceNumber+"快速客户服务耗时"+time+"秒");

}

else  //如果没有快速客户则为普通客户服务

{

    System.out.println(windowNumber+"没有快速客户任务");

    commonService();

}

}

 

public void VipService()  //VIP服务

{

  String windowNumber="第"+number+"号"+Type+"窗口";

 

  Integer serviceNumber  =  NumberMachine.getInstance().getVIPManager().fetchNumber();

            //获取VIP窗口当前要服务的号码

  System.out.println(windowNumber+"等待VIP客户任务");

 

if (serviceNumber!=null)

{

  System.out.println(windowNumber+"开始为第"+serviceNumber+"VIP客户服务");

  int time=new Random().nextInt(constants.MAX_SERVICE_TIME+1);

        //为VIP办理业务的时间是随机性的1到10秒

try 

{

     Thread.sleep(time*1000);

 } 

catch (InterruptedException e) 

{

     e.printStackTrace();

 }

    System.out.println(windowNumber+"为第"+serviceNumber+"VIP客户服务耗时"+time+"秒");

}

else   //如果当前没有VIP客户也为普通客户服务

{

  System.out.println(windowNumber+"没有VIP客户任务");

  commonService();

}

}

}



 

 

验证类:
package com.bank;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

 

public class mainClass {

public static void main(String[]args)

{

    //普通窗口4个,快速窗口1个,VIP客户1个

   for(int x=1;x<5;x++)

{

ServiceWindow commonWindow=new ServiceWindow();

commonWindow.setType(CustomerType.COMMON);

commonWindow.setNumber(x);

commonWindow.start();

}

 

ServiceWindow expressWindow=new ServiceWindow();

expressWindow.setType(CustomerType.EXPRESS);

expressWindow.start();

 

ServiceWindow vipWindow=new ServiceWindow();

vipWindow.setType(CustomerType.VIP);

vipWindow.start();

 
/*客户数量比例:普通客户:快速客户:VIP客户=6:3:1

所以普通客户每个1秒来一个,快速客户2秒来一个,VIP客户6秒来一个为每一种客户定义一个定时器*/

 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

new Runnable(){

         public void run()

{

        Integer number=NumberMachine.getInstance().getCommonManager().generateNewNumber();

       System.out.println("第"+number+"位普通客户等待服务中");

}},

0,

1, 

TimeUnit.SECONDS);

 

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

new Runnable(){

         public void run()

{

     Integer number=NumberMachine.getInstance().getExpressManager().generateNewNumber();

     System.out.println("第"+number+"位快速客户等待服务中");

}},

0,

2, 

TimeUnit.SECONDS);

 

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

new Runnable(){

         public void run()

{

        Integer number=NumberMachine.getInstance().getVIPManager().generateNewNumber();

        System.out.println("第"+number+"位VIP客户等待服务中");

}},

0,

6, 

TimeUnit.SECONDS);

}

}


你可能感兴趣的:(学习笔记)