`
把阳光剪成雨Java
  • 浏览: 25254 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

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

阅读更多

 

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

 

银行业务调度系统

1.  熟悉银行的业务。

银行有一个取号机,vip窗口,普通窗口,快速窗口。取号机取出的号码相当于客户,窗口需要叫号。可以把这个逻辑封装成一个对象NumberManager

2.  创建号管理类NumberManager

package cn.itheima.interview.bank;

import java.util.ArrayList;

import java.util.List;

public class NumberManager {

    private int lastNumber = 1;

    // 在创建对象的时候尽量使用父类或者接口指向子类对象,不仅灵活而且看起来比较专业。

    private List<Integer> queue = new ArrayList<Integer>();

 

    // 下面这两个方法,在程序运行的时候,是由两个不同的线程调用。它们操作了同一个变量queue.

    // 所以用到synchronized关键字进行同步。

    public synchronized int generateNumber() {

       // 调用一次生成一个号码,把它加入队列中。然后再返回该值,让外界知道新客户来了。

       // lastNumber自增,如果再有下个用户来了,直接加入队列中,继续上述操作。

       queue.add(lastNumber);

       return lastNumber++;

    }

 

    public synchronized int fetchServiceNumber() {

       // 记住这种设计思想,从一个容器中取走(得到该值,并且容器删除该值)一个值。

       Integer number = null;

       if (queue.size() > 0) {

           number = queue.remove(0);

       }

       return number;

    }

}

3.  创建取号码的机器。

由于一个银行只有一个取号机器,采用单例设计模式。

package cn.itheima.interview.bank;

 

public class NumberMachine {

    private NumberManager commonManager;

    private NumberManager expressManager;

    private NumberManager vipManager;

 

    private NumberMachine() {

    }

//单例设计模式。

    private static NumberMachine instance = new NumberMachine();

    public static NumberMachine getInstance() {

       return instance;

    }

 

    public NumberManager getCommonManager() {

       return commonManager;

    }

 

    public NumberManager getExpressManager() {

       return expressManager;

    }

 

    public NumberManager getVipManager() {

       return vipManager;

    }

 

}

 

4.创建服务窗口。

package cn.itheima.interview.bank;

 

import java.util.Random;

import java.util.concurrent.Executors;

 

public class ServiceWindow {

    private CustomerType type = CustomerType.COMMON;

    private int number = 1;

 

    public void setType(CustomerType type) {

       this.type = type;

    }

 

    public void setWindowId(int number) {

       this.number = number;

    }

 

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

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

              System.out.println(windowName + "开始准备获取任务!");

              Integer serviceNum = NumberMachine.getInstance()

                     .getCommonManager().fetchServiceNumber();

              if (serviceNum != null) {

                  System.out.println(windowName + "开始为第" + serviceNum

                         + "vip客户服务");

 

                  long startTime = System.currentTimeMillis();

                  int randomTime = Constants.MAX_SERVICE_TIME

                         - Constants.MIN_SERVICE_TIME;

                  long serviceTime = new Random().nextInt(randomTime) + 1

                         + Constants.MIN_SERVICE_TIME;

                  try {

                     Thread.sleep(serviceTime);

                  } catch (InterruptedException e) {

                     e.printStackTrace();

                  }

                  long costTime = System.currentTimeMillis() - startTime;

 

                  System.out.println(windowName + "窗口完成第" + number

                         + "号快速vip的服务,共耗时" + costTime / 1000 + "");

              } else {

                  System.out.println(windowName + "没有取得vip任务");

                  commonService();

              }

           }

 

           private void expressService() {

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

              System.out.println(windowName + "开始准备获取任务!");

              Integer serviceNum = NumberMachine.getInstance()

                     .getCommonManager().fetchServiceNumber();

              if (serviceNum != null) {

                  System.out.println(windowName + "开始为第" + serviceNum

                         + "号快速客户服务");

 

                  long startTime = System.currentTimeMillis();

                  int randomTime = Constants.MAX_SERVICE_TIME

                         - Constants.MIN_SERVICE_TIME;

                  long serviceTime = new Random().nextInt(randomTime) + 1

                         + Constants.MIN_SERVICE_TIME;

                  try {

                     Thread.sleep(serviceTime);

                  } catch (InterruptedException e) {

                     e.printStackTrace();

                  }

                  long costTime = System.currentTimeMillis() - startTime;

 

                  System.out.println(windowName + "窗口完成第" + number

                         + "号快速用户的服务,共耗时" + costTime / 1000 + "");

              } else {

                  System.out.println(windowName + "没有取得快速任务");

                  commonService();

              }

 

           }

 

           private void commonService() {

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

              System.out.println(windowName + "开始准备获取任务!");

              Integer serviceNum = NumberMachine.getInstance()

                     .getCommonManager().fetchServiceNumber();

              if (serviceNum != null) {

                  System.out.println(windowName + "开始为第" + serviceNum

                         + "号普通客户服务");

 

                  long startTime = System.currentTimeMillis();

                  int randomTime = Constants.MAX_SERVICE_TIME

                         - Constants.MIN_SERVICE_TIME;

                  long serviceTime = new Random().nextInt(randomTime) + 1

                         + Constants.MIN_SERVICE_TIME;

                  try {

                     Thread.sleep(serviceTime);

                  } catch (InterruptedException e) {

                     e.printStackTrace();

                  }

                  long costTime = System.currentTimeMillis() - startTime;

 

                  System.out.println(windowName + "窗口完成第" + number

                         + "号普通用户的服务,共耗时" + costTime / 1000 + "");

              } else {

                  System.out.println(windowName + "没有取得普通任务,空闲1");

                  try {

                     Thread.sleep(1000);

                  } catch (InterruptedException e) {

                     e.printStackTrace();

                  }

              }

 

           }

 

       });

    }

 

}

5.  创建测试类包含用户的取号。

 

package cn.itheima.interview.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 commonWindow = new ServiceWindow();

           commonWindow.setType(CustomerType.COMMON);

           commonWindow.setWindowId(i);

           commonWindow.start();

       }

       // 产生1个快速用户

       ServiceWindow expressWindow = new ServiceWindow();

       expressWindow.setType(CustomerType.EXPRESS);

       expressWindow.setWindowId(1);

       expressWindow.start();

       // 产生1vip用户

       ServiceWindow vipWindow = new ServiceWindow();

       vipWindow.setType(CustomerType.EXPRESS);

       vipWindow.setWindowId(1);

       vipWindow.start();

 

       // 普通客户拿号

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

           public void run() {

              Integer serviceNumber = NumberMachine.getInstance()

                     .getCommonManager().generateNumber();

              /**

               * 采用logger方式,无法看到直观的运行效果,因为logger.log方法内部并不是直接把内容打印出出来,

               * 而是交给内部的一个线程去处理,所以,打印出来的结果在时间顺序上看起来很混乱。

               */

              // logger.info("" + serviceNumber + "号普通客户正在等待服务!");

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

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

              System.out.println("" + serviceNumber + "VIP客户正在等待服务!");

           }

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

    }

}

 

 

分享到:
评论

相关推荐

    软通动力面试题——银行业务调度系统

    "软通动力面试题——银行业务调度系统" 在本篇文章中,我们将对软通动力的银行业务调度系统面试题进行详细的分析和解释。该系统模拟了银行业务调度系统的逻辑,涵盖了客户分类、窗口管理、业务办理时间等多个方面。...

    面试题——银行业务调度系统-源代码

    【标题】:“面试题——银行业务调度系统-源代码”涉及的是一个基于JavaSE的银行后台管理系统,旨在处理银行日常的业务调度问题。这个系统可能是为了模拟或优化银行内部的工作流程,例如账户管理、交易处理、客户...

    02-7K月薪面试题破解之二_银行业务调度系统视频教程

    02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-...

    银行业务调度系统

    【银行业务调度系统】 在IT领域,银行业务调度系统是一个至关重要的组成部分,它负责管理和优化银行内部的各项业务流程,确保高效、稳定且安全地运行。此类系统通常涉及到多个子系统和模块,包括任务调度、资源分配...

    银行业务调度系统分析

    银行业务调度系统是金融机构核心系统的重要组成部分,它负责协调并管理银行的各种业务操作,确保高效、稳定、安全地处理大量交易。在这个系统中,多线程技术的应用是至关重要的,因为它能够实现并发处理,提高系统...

    张孝祥银行业务调度系统源代码

    总的来说,【张孝祥银行业务调度系统源代码】是一个宝贵的教育资源,对于想要深入理解银行业务处理和系统开发的程序员来说,提供了实战性的学习素材。通过研究和实践,可以提升对银行业务流程的理解,掌握系统设计和...

    张孝祥银行业务调度系统源代码 第二次写 复习

    【银行业务调度系统】是软件开发中的一个重要领域,主要用于处理银行内部的各种业务流程,如存款、取款、转账等操作的高效协调与管理。张孝祥的【银行业务调度系统源代码】则提供了对此类系统的一种实现,通过复习和...

    银行业务调度系统的实现

    在IT行业中,银行业务调度系统是金融机构核心技术基础设施的一部分,它负责高效、稳定地处理大量复杂的业务请求。这篇博文“银行业务调度系统的实现”探讨了如何设计并实施这样的系统,以优化银行的服务质量和效率。...

    张孝祥银行业务调度系统

    张孝祥银行业务调度系统由赤霄扬天上传。看好程序,看优秀代码,写出自己的优秀代码。

    银行业务调度系统需求及面试题及代码

    银行业务调度系统是一种关键的IT解决方案,主要用于优化银行内部的工作流程,提高服务效率,并确保业务操作的顺畅进行。本资源包含三个主要部分:银行业务调度系统的需求分析、面试题库以及实际的系统实现代码。 ...

    操作系统课程设计——处理机调度

    在这个"操作系统课程设计——处理机调度"项目中,我们将深入探讨处理机调度的原理与实践。 处理机调度的目标是有效地分配CPU时间,确保系统能够快速响应用户的请求,同时优化系统性能。它主要关注以下几个方面: 1...

    银行调度系统样例代码

    黑马程序员银行调度系统样例代码,共有3个主要类,2个辅助类,一个运行实例类,分别为: 1.3个主要类 NumberMachine,取号码器 NumberManager,号码管理器 ServiceWindow,业务窗口 2个辅助类 Constants,常量池 ...

    银行业务调度系统模拟

    在银行业务调度系统模拟中,我们探讨的核心是一个高效、安全且可靠的系统,它能够处理银行日常的事务操作,包括存款、取款、转账等。这个系统是基于Java编程语言实现的,利用其强大的面向对象特性以及丰富的库支持,...

    银行业务调度系统图形版

    银行业务调度系统图形版是一个专为金融机构设计的高级软件系统,它通过图形用户界面(GUI)提供直观且高效的业务操作和管理。GUI编程是该系统的核心组成部分,它使得银行员工和管理者能够通过易于理解的图形元素,如...

    【IT教程网】银行业务调度系统教程_源码与PPT_it_银行_银行管理系统_

    在本教程中,我们将深入探讨“银行业务调度系统”,这是一个重要的IT应用,特别是在现代金融机构中。这个系统的主要目标是优化银行窗口服务流程,提高效率,减少客户等待时间,提升客户满意度。通过学习这个教程,你...

    黑马程序员--银行管理系统

    模拟实现银行业务调度系统逻辑,具体需求如下: 1.银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 2.有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、...

Global site tag (gtag.js) - Google Analytics