黑马程序员 java面试之银行调度系统

黑马程序员面试宝典(java)2018版 黑马程序员java面试宝典内容很全,近上万名黑马学子面试时遇到的问题。有需要的朋友可以下载看看,特别是面试的同学 立即下载

                         ----------- android培训、java培训、java学习型技术博客、期待与您交流! --------

需求:

1,银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。

2,有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。

3,异步随机生成各种类型的客户,生成各类型用户的概率比例为:VIP:客户普通客户:快速客户  =  1 :6 :3。

4,客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理所需的时间, 快速客户办理业务所需时间为最小值(提示:办理业务的过程可 线程Sleep的方式模拟)。

5,各类型客户在其对应窗口按顺序依次办理业务。

6,当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

7, 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。

8, 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

分析:

1,首先通过需求,提取类和对象的信息。 三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,各客户在其对应窗口 顺序依次办理业务 。其实每一个客户其实就是由银行的一个取号机器产生的方式来表示的。所以,想到要有一个号码管理器对象,让这个对象不断地产生号码,就等机生成了客户。

2,由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生三码管理器对象,各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码机器管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。
3,各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。之所以各个窗口知道叫哪一个号,它一定是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。

步骤:

1,定义一个摇号器。

//定义一个摇号器。
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;
		}
	}
}
2,定义一个管理号码的容器,分别把号码给普通,快速,VIP客户。

//分给普通,快速,VIP客户号码。
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();
	public NumberManager getCommonManager() {
		return commonManager;
	}
	public NumberManager getExpressManager() {
		return expressManager;
	}
	public NumberManager getVipManager() {
		return vipManager;
	}
	
}

 3,创建ServiceWindow窗口。

public class ServiceWindow {
	private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");
	private CustomerType type = CustomerType.COMMON;
	private int number = 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();
		}
	}
	
	private void vipService(){

		Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
		String windowName = "第" + number + "号" + type + "窗口";	
		System.out.println(windowName + "开始获取VIP任务!");			
		if(serviceNumber !=null){
			System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务");			
			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 + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒");		
		}else{
			System.out.println(windowName + "没有取到VIP任务!");				
			commonService();
		}	
	}
}

4,定义时间消耗的Constants类。

public class Constants {
	public static int MAX_SERVICE_TIME = 10000; //10秒!
	public static int MIN_SERVICE_TIME = 1000; //1秒!
	
	/*每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来
	 * 平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以,
	 * 1秒钟产生一个普通客户比较合理,*/	
	public static int COMMON_CUSTOMER_INTERVAL_TIME = 1; 	
}

5,主程序入口。

public class MainClass {
	
	private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");
	

	public static void main(String[] args) {
		//产生4个普通窗口
		for(int i=1;i<5;i++){
			ServiceWindow window =  new ServiceWindow();
			window.setNumber(i);
			window.start();
		}
	
		//产生1个快速窗口
		ServiceWindow expressWindow =  new ServiceWindow();
		expressWindow.setType(CustomerType.EXPRESS);
		expressWindow.start();
		
		//产生1个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);
		
		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培训 、java学习型技术博客、期待与您交流! --------

黑马程序员java面试宝典 完整版PDF.rar 黑马程序员java面试宝典内容很全,近上万名黑马学子面试时遇到的问题。有需要的朋友可以下载看看,特别是面试的同学 立即下载

相关推荐

解决com.kingbase8.util.KSQLException: This _connection has been closed.

一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend. java.net.SocketTimeoutException: Read timed out.

qq_38127559的博客 2757

java开发核心面试题

元空间就是方法区Java1.8把方法区和永久代放到了本地内存的元空间,因为元空间中保存类信息和静态变量,随着代码加载这些类信息不可控,放在堆空间中容易内存溢出,为了避免OOM所以优化之后放在了本地内存。

weixin_51146806的博客 2521

MySQL安装配置教程(超级详细)

一、 下载MySQL Mysql官网下载地址:MySQL :: Download MySQL Installer (Archived Versions) 1. 选择要安装的版本,本篇文章选择的是5.7.31版本,点击Download下载 正在上传…重新上传取消 二、 安装MySQL 1. 选择设置类型双击运行mysql-installer-community-5.7.31.0.msi 这里选择是自定义安装,所以直接选择“Custom”,点击“Next” “Developer Default”是

m0_67322837的博客 5万+

黑马程序员-java就业面试题大全(持续更新)

1、一个"java"源文件中是否可以包含多个类()?

苦行僧 4956

别再浪费主板上的PCIE插槽了!手把手教你用VL805芯片打造高速USB3.0扩展坞

本文详细介绍了如何利用VL805芯片将主板闲置的PCIE插槽改造为高性能USB3.0扩展坞。从芯片选型、电路设计到焊接工艺和系统调试,提供了一套完整的实战指南,帮助用户充分释放硬件潜能,实现高达5Gbps的传输速度。

weixin_27134495的博客 329

AD(AltiumDesigner)封装导入allegro生成allegro封装

AD(AltiumDesigner)封装导入allegro生成allegro封装 貌似PCB的封装问题是一个无尽话题,为了简单我总是想找捷径(主要还是太懒了),因为也是近期才开始学习使用allegro进行PCB设计,在最近的一个设计中,很多器件封装allegro中都没有,一个一个画感觉很费时间,但是在AD(AltiumDesigner)的封装库中是有的,于是便想着AD的封装库能不能倒入到alleg...

yangh2560的博客 2万+

Java项目,黑马程序员的黑马点评项目面试问题总结,高频问题,进阶深挖题,Redis核心以及Redisson 分布式锁的 WatchDog 机制原理

【代码】Java项目,黑马程序员的黑马点评项目面试问题总结,高频问题,进阶深挖题,Redis核心以及Redisson 分布式锁的 WatchDog 机制原理。

2301_80361887的博客 1030

HALCON卡尺模型实战:5分钟搞定工件尺寸测量(附完整代码)

本文详细介绍了HALCON卡尺模型在工件尺寸测量中的实战应用,通过5分钟快速搭建测量系统的完整指南,包括基础配置、高级参数调优和完整代码示例。卡尺模型能自动识别边缘并计算精确尺寸,显著提升工业视觉检测的效率和一致性,特别适用于实时测量场景。

weixin_42570296的博客 463

2021黑马程序员Java面试宝典笔记(完整版)

refresh 是 AbstractApplicationContext 中的一个方法,负责初始化 ApplicationContext 容器,容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法,我们把它们称为 refresh 的 12 个步骤:onRefresh。

web18296061989的博客 1396

【IoT】 产品设计之结构设计:如何设计产品按键

1、硅胶按键功能实现有两种接触方式 1)硅胶按键按压在DOME片(锅仔片)上 通常用在手机、儿童手表手机、防水手机等防水设备上。 2)硅胶按键增加导电基,一种黑色的导电碳粒,实现回路导电 通常用在遥控器、电脑键盘、特殊设备上。 两种方式结构设计原理是一样的,按键的固定与配合间隙与行程要确保好。 2、硅胶遥控器按键的结构方式(导电基) 按键帽为大颗粒实心的,触点为黑色导电基,通过压注成型融合为一体,那么这种按键结构设计时需要注意那些呢? 最主要的是按键按压回弹的手感,由于没有DOME片实现

产品线负责人 8673

物理信息神经网络(PINN)文献综述 —— 原理、严格推导与优化训练策略

本章系统阐述物理信息神经网络的理论基础、主要算法改进与训练策略。内容涵盖:PINN 的数学表述与残差构造;损失与梯度的逐步推导;训练困难(梯度消失/爆炸、损失幅度不平衡、频谱偏差、采样效率低等)的定量分析;四类核心解决方案(动态损失加权、梯度归一化与预条件化、自适应采样、分阶段/分域训练)的详细推导与实现要点;以及若干关键算法的伪代码与收敛性形式结论。所有涉及推导的步骤均按顺序展开,给出必要的数学依据与结论性陈述,可直接作为教学或参考章节使用。

u012133341的博客 423

黑马Java面试教程_P9_JVM虚拟机

为什么要学JVM,应对面试,中高级程序员必备,深入了解JAVA。程序计数器:线程私有的,每个线程一份,内部保存字节码的行号。用于记录正在执行的字节码指令的地址。javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数。我们可以得到下图。java虚拟机对于多线程是通过线程轮流切换并且分配线程执行时间。在任何的一个时间点上,一个处理器只会处理执行一个线程,如果当前被执行的这个线程它所分配的执行时间用完了【挂起】。处理器会切换到另外的一个线程上来进行执行。

buyaotutou的博客 833

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

黑马程序员--Java 7K面试题之银行调度系统

1.银行调度系统: 银行业务调度系统   模拟实现银行业务调度系统逻辑,具体需求如下:   Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。   Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。   Ø 异步随机生成各种类型的客户,生成各类型用户的概率比例为:        

江湖小小生 948

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

黑马程序员——JAVA面试题银行调度系统

------- android培训、java培训、期待与您交流! ---------- 一、项目需求 模拟实现银行业务调度系统逻辑,具体需求如下:  1、银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。  2、有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 

yangyang533的专栏 410

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

黑马程序员——java面试中常遇到的面试项目——银行业务调度系统

------- android培训、java培训、期待与您交流! ---------- 银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。

shaguayidianhong的专栏 1395

黑马程序员 - Java 面试题破解 银行业务调度系统

黑马程序员 - Java 面试题破解        银行业务调度系统   需求分析:       模拟实现银行业务调度系统逻辑,具体需求如下:       银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。       有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。       异步随机生成各种类

Qiangoo 482

黑马程序员——JAVA7K面试题——银行调度系统

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 第一讲.概述 通过对张孝祥老师7k面试题视频的学习,边看边敲代码对比之前的交通灯调度系统,对张老师的代码做了一点简化(去掉了单例设计的NumberMachine)银行调度系统的需求如下/** 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 -

老七聊AI 745

黑马程序员——Java面试题之银行业务调度系统

----------------------ASP.Net+Android+Unity开发、Java培训、期待与您交流! ----------------------

288

黑马程序员—java面试题之银行业务调度系统

----------android培训、java培训、期待与您交流! ---------- 银行业务调度系统 需求分析: 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生

LHYH3的专栏 903

【黑马程序员】Java7K面试题21:银行业务调度系统

------- android培训、java培训、期待与您交流!---------- 一、银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: 1、银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口; 2、有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户); 3、异步随机生成各种类

lepor 907

黑马程序员_java进阶之面试题:模拟银行业务调度系统

------- android培训、java培训、期待与您交流! ---------- 模拟实现银行业务调度系统逻辑,具体需求如下:    银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。   有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。   异步随机生成各种类型的客户,生成各类型用户的概率比例为

Java学习交流 418

【黑马程序员】Java面试题 银行业务调度系统

1. 需求业务         模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为:          VIP客户 :普通客户 :快速客户  =  1

whight的专栏 443

黑马程序员——浅谈java中的面试题(银行业务调度系统)

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 一、需求 模拟实现银行业务调度系统逻辑,具体需求如下:         1、银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。         2、有三种对应类型的客户:VIP客户

meijdou的专栏 655

黑马程序员-java面试题-银行业务调度系统

一、银行业务调度系统的项目需求

Fivedays的专栏 635
上一篇: 黑马程序员 java 面试之交通信号灯
下一篇: 黑马程序员 java笔记之异常
skill2020
博客等级 码龄16年 0粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值