黑马程序员,银行调度系统

华为OD机试 新系统真题-收集灵草(Java/Py/C++/Go/C/Js) 华为OD机试 新系统真题【收集灵草】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【收集灵草】多语言题解。 阅读详情

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

银行调度系统,java是面向对象的语言,一些从实际出发,我们把银行调度系统,

本着谁用户数据谁就有对其操作的方法抽成对象,根据实际情况去

需求分析,完成对象,实现系统。里面的定时器很好用,建议多用用

模拟,实现银行系统逻辑:

1,银行内有6个服务窗口,1到4号位普通窗口,还有一个快速窗口,一个VIP窗口。

2,对应的就有3中类型的客户:vip客户,快速客户(办理水电等缴费的业务),普通客户(存取钱)。

客户通过领取对应类型号码的方式,获取服务。(可以定义一个号码产生机器里面产生3中类型的号码)

3,我们可以用1.5的Executors实现随机生成各种类型的客户,生成类型客户比例为:

vip:普通:快速:=1:6:3;

4,因每个客户办理业务所需的时间不同,我们可以设置时间的最大值和最小值,让快速客户服务时间为最小值,

普通,VIP客户随机取最大和最小之间.(服务时间可以通过THread.sleep();实现);

5,3中类型的客户在对应得窗口获取服务,银行通过窗口叫号的方式,给客户服务(在窗口里设置)

vip和快速窗口没有对应的客户,当普通窗口使用,一旦有对应的客户优先本类型客户。


。。。。。。。。。。。。

业务逻辑团:


@NumberManager类

定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行synchronized同步。

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)
{
number = queueNumber.remove(0);
}
return number;
}
}

NumberMachine类
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。
将NumberMachine类设计成单例。

public class NumberMachine {
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;
}

private NumberMachine(){}

public static NumberMachine getInstance(){
return instance;
}

private static NumberMachine instance = new NumberMachine();
}

CustomerType枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
重写toString方法,返回类型的中文名称。

public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString() {
switch (this) {
case COMMON:
return "普通";

case EXPRESS:
return "普通";

case VIP:
return name();

}
return null;
}
}

ServiceWindow类
定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。 

这里没有考虑代码的优化。
定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。

注意:普通服务里面的打印信息 不要用变量type了,因为 快速vip没有本类客户时会调用,为普通客户服务,

如果是tpye了虽然是为普通客户服务,可是显示却是为快速vip服务

public class ServiceWindow {
private CustomerType type = CustomerType.COMMON;
private int windowId = 1;

public void setType(CustomerType type) {
this.type = type;
}


public void setWindowId(int windowId) {
this.windowId = windowId;
}


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 commonService() {
String windowName = "第"+windowId+"号"+type+"窗口";

Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number != null){
System.out.println(windowName+"为第"+number +"个"+"普通"+"客户服务");
long beginTime = System.currentTimeMillis();
int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
long serviceTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number +"个"+"普通"+"客户完成服务,耗时"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到任务,先休息1秒钟!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {

e.printStackTrace();
}
}
}

private void expressService() {
String windowName = "第"+windowId+"号"+type+"窗口";

Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number != null){
System.out.println(windowName+"为第"+number +"个"+type+"客户服务");
long beginTime = System.currentTimeMillis();
//int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
//long serviceTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number +"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到任务!");
commonService();

}
}
private void vipService() {
String windowName = "第"+windowId+"号"+type+"窗口";//窗口的名称用tpye

Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number != null){
System.out.println(windowName+"为第"+number +"个"+type+"客户服务");
long beginTime = System.currentTimeMillis();
int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
long serviceTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number +"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到任务!");
commonService();

}
}
}

MainClass类
用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。


public class MainClass {


/**
* @param args
*/
public static void main(String[] args) {
for (int i = 1; i < 5; i++) {
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.start();
}
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();

ServiceWindow expressWindow = new ServiceWindow();
vipWindow.setType(CustomerType.EXPRESS);
expressWindow.start();


Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println(number + "号普通客户等待服务~");
}
}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME, 
TimeUnit.SECONDS);

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println(number + "号快速客户等待服务~");
}
}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, 
TimeUnit.SECONDS);


Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println(number + "号VIP客户等待服务~");
}
}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, 
TimeUnit.SECONDS);
}

}

Constants类
定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME

这里记得要赋值,负责mainclass里面的定时器会出现参数无效异常

public class Constants {
public static int MAX_SERVICE_TIME = 10000;
public static int MIN_SERVICE_TIME = 1000;
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}


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

开源免费!ReaLTaiizor如何用MIT许可证打造专业级WinForm UI? 摘要: ReaLTaiizor是一款开源UI控件库,为WinForm应用提供现代化界面解决方案。支持100+组件、多主题切换(浅色/深色/自定义)和.NET 4.8-8.0全版本兼容,MIT许可证允许免费商用。通过NuGet快速安装,3步改造传统界面:1)注入主题(如this.Theme = new Dark()),2)替换原生控件为高颜值组件(如ModernGrid替代DataGridView),3)集成高级功能(分页/动画提示)。典型场景包括登录界面美化(进度动画+通知控件)和数据表格Material风 阅读详情

相关推荐

STM32CubeMX平台F4系列固件下载核心要点

详解STM32CubeMX平台下F4系列单片机的固件包下载方法与常见问题,重点讲解stm32cubemx固件包下载流程及配置技巧,帮助开发者快速完成开发环境搭建。

weixin_42575505的博客 894

黑马程序员 银行调度系统

-----------android培训、java培训、java学习型技术博客、期待与您交流! ----------- 银行业务调度系统: 模拟实现银行业务调度系统: 1,有6个业务窗口,4个普通窗口,1个快速窗口,1个VIP窗口。 客户比例对应为:6:3:1其中当快速窗口或VIP窗口空闲时,可以办理普通业务。 2,客户办理业务所需时间是随机的,有最大和最小值。快速客户办理用时为

405

攻防世界:Crypto习题之easy_RSA

在非对称加密算法中,单向函数被广泛应用,用于确保从公钥加密后的密文无法轻易推导出私钥,从而保证数据的安全性。而其中最著名的算法便是 RSA 加密算法。首先设φm:=∣1≤k≤mgcdkm1∣为欧拉函数(Euler’sche Phi-function)。pqn:=pqpqφnnpqpqφnp−1q−1e∈12...φn−1gcdφne1ended≡1φn假设我们现在有明文x以及公钥en。

qq_52789488的博客 1572

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

首先明确有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务。 其次,需要一个号码管理器对象,由于有三类客户,且每类客户号码的编排都是完全独立的,所以该系统中一共要产生三个号码管理器对象,各自管理一类客户的编排号码。这三个号码管理器对象统一的由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以该机器对象要使用单

Lym_2014的专栏 512

AMCL代码详解(六)amcl中的重采样

每次都从w1左边的竖线开始转,显而易见,转到w1的概率为0-w1之间的随机数,转到w2的概率为w1到w1+w2之间的随机数,转到w3的概率为w1+w2到w1+w2+w3之间的随机数,后面的依次类推。当某个粒子的权值较大的时候,产生的随机数落在相应区间的概率就会增大,从而实现了对权值大粒子的多次复制,权值小的粒子的剔除。可以看出,在整个重采样的过程中,粒子进行了两次种情况的刷新,一种是随机生成的新的粒子,一种是对原来的粒子的复制。得到的值越大,说明粒子的权重越小,当前粒子的可信度比较小,需要重采样粒子。

YiYeZhiNian的博客 1579

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1277

"黑马程序员"银行调度系统

到银行办理业务,先到取号机取号,再根据编号等待,到你这个号的时候就去窗口办理业务。取号机界面有三个按扭,分别普通客户,VIP客户,快速办理业务客户。还得有三个号码管理器,分别对普通、快速和VIP客户的号码进行管理。银行服务窗口分为普通、快速和VIP客户服务窗口。 通过上述的描述,一定要创建NumberManager类,NumberMachine类,ServiceWindow类,CustomerT

wangcaisheng_的专栏 501

嵌入式软件面试常见问题及答案

干了多年的嵌入式,被面试过,也面过不少新人,下面这些是面试中很常见的一些问题及答案,答案可以根据自己的经验自己思考下。--持续补充并更新

weixin_37553721的博客 6024

黑马程序员--银行调度系统

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

u012634876的专栏 1011

手把手教你 Ubuntu 24.04 离线安装 Ollama

本文介绍 Ubuntu 下离线安装 Ollama 并使用 Ollama 部署 llama3.1-70b 大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1018

097、Zephyr RTOS驱动开发实战:传感器驱动(陀螺仪)

I2C速率别设太高:LSM6DSO支持最高400kHz,但实际布线有寄生电容时,400kHz容易出错。工业产品我统一用100kHz,稳定压倒一切。FIFO水印值要计算:假设ODR=6.66kHz,每150us产生一组数据,如果水印设32组,则每4.8ms触发一次中断。这个间隔要大于I2C读取耗时(实测约200us),否则中断堆积。电源纹波敏感:陀螺仪对电源噪声敏感,特别是3.3V供电时。我遇到过因为DC-DC纹波太大,陀螺仪输出噪声从0.1dps飙升到2dps。

m0_50546716的博客 118

黑马程序员_银行调度系统

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

besidescrazy的专栏 566

3分钟学会SQL中的断点去重技术,轻松搞定连续重复数据去重问题?

传感器采集的温度数据中,存在连续重复的值,需仅在数值变化时保留记录(例如:温度从 25°C 变为 26°C 时记录一次)。:判断逻辑,current_value!若当前温度与前一行的温度不同(或为第一条记录),则保留该行。的技术,常用于时间序列或状态日志中。:将连续相同值的记录合并,只保留断点处的记录。保留断点处的记录(即温度变化时的第一条)。原始数据表 sensor_data。最终仅保留值变化的断点记录。获取前一行的温度值。

石榴姐yyds 1019

黑马程序员—银行调度系统解析

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

zxhhui1987的专栏 567

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

黑马程序员-银行调度系统

------- android培训、java培训、期待与您交流! ----------    需求: (1)银行有6个业务窗口,1-4窗口为普通窗口,5号窗口为快速窗口,6号窗口为vip窗口。 (2)有三种对应类型的客户:vip客户,普通客户,快速客户(班里如交水电费、电话费之类业务的客户)。 (3)异步随机生成各种类型的客户,生成各类型用户的概率比例为: vip客户:普通客户:快

王亚飞的技术专栏 477

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

黑马程序员-自己写的银行调度系统

--------------------- android培训、java培训、期待与您交流! ---------------------- 自己写的银行调度系统 张老师讲银行调度系统题目及结果演示时,就迫不及待的先开始了自己的实现。 设计要求: 1.模拟客户到来,有三种客户:普通,快速和VIP,比例是6:3:1 2.银行有6个业务窗口:1-4普通,5快速,

Joyep 556

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

黑马程序员-有关银行调度系统的笔记和总结

------------------- android开发、java培训、期待与您交流! ---------------------- 黑马程序员-有关银行调度系统的笔记和总结 /* 银行业务调度系统 需求: 1,银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口 2,有三种对应类型的客户:VIP客户,普通客户,快速客户。 3,异步随机生成

u014300492的专栏 565

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

银行业务调度系统 ------------------------------------------------------------------------------------------------------------------------------------ 项目需求 模拟实现银行业务调度系统逻辑,具体需求如下: 》 银行内有6个业务窗口,1 -

wanghed的专栏 656

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

银行业务调度系统

INT_INIT的专栏 763
上一篇: 黑马程序员,枚举总结
下一篇: 黑马程序员,交通管理系统
weiheima
博客等级 码龄15年 3粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值