<黑马程序员>银行业务调度系统

本文深入探讨了使用Java与Android技术开发一个高效的服务窗口系统的过程,包括需求分析、系统设计、关键代码实现及单例模式应用。重点介绍了如何通过同步机制、随机数生成与枚举类定制化提升系统的并发处理能力和用户体验。
摘要由CSDN通过智能技术生成

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

与之前的交通灯系统一样,在开发本系统时,先要对需求进行充分了解,然后把项目的设计方法和逻辑弄清楚,再开始项目开发。因为之前已经学习过了项目设计方法,本篇主要是介绍在开发阶段涉及的关键代码。

首先,编写的是NumberManager和NumberMachine类。

       当2个不同的线程访问相同的数据queueNumber就会出问题。要让他们之前互斥使用了synchronized,因为queueNumber.remove(0)有可能会取到null,null要返回int就会产生空指针,程序会产生异常。所以在这里使用Integer可以对数据自动进行拆箱和装箱。

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){

           return queueNumber.remove(0);

       }

       return number;

    }

}

 

添加单例的概念将NumberMachine类设计成单例。

    //单例

    //首先构造方法,私有化只能静态调用

    private NumberMachine(){}

    public static NumberMachine getInstance(){

       return instance;

    }

    private static NumberMachine instance = new NumberMachine();

 

随机产生有基数的数

int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;

long serviceTime = new Random().nextInt(maxRand) + 1 + Constants.MIN_SERVICE_TIME;

然后是编写CustomerType枚举类,对枚举的toString()方法进行重写,使其可在调用枚举元素时将其用中文显示。

public enum CustomerType {

    COMMON,EXPRESS,VIP;

    public String toString(){

       switch(this){

       case COMMON:

           return "普通窗口";

       case EXPRESS:

           return "快速窗口";

       case VIP:

           return name();//name()方法返回枚举的名字 VIP

       }

       return null;

    }

}

接下来就是创建服务窗口,编写一个ServiceWindow类

    private void commonService() {

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

       if(number != null){

           long beginTime = System.currentTimeMillis();

           int maxRand

           long serviceTime = new Random().nextInt(maxRand)                     Thread.sleep(serviceTime);

           long costTime = System.currentTimeMillis() - beginTime;

       }else{

              Thread.sleep(1000);

       }

最后是编写创建主线程MainClass类,异步概率比例生成各种类型的客户

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

              new Runnable(){

                  public void run(){

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

                         }

              },

              0,

              Constants.COMMON_CUSTOMER_INTERVAL_TIME,

              TimeUnit.SECONDS

              );

 


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

详细请查看:http://edu.csdn.net/heima


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值