模拟银行存取钱-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)

news2024/11/17 15:34:44

【案例8-3】  模拟银行存取钱

【案例介绍】

  1.任务描述

在银行办理业务时,通常银行会开多个窗口,客户排队等候,窗口办理完业务,会呼叫下一个用户办理业务。本案例要求编写一个程序模拟银行存取钱业务办理。假如有两个用户在存取钱,两个用户分别操作各自的账户,并在控制台打印存取钱的数量以及账户的余额。

2.运行结果

运行结果如图8-1所示。

图8-1 运行结果

 

【案例思路】

  1. 通过任务描述和运行结果可以看出,该任务需要使用多线程的相关知识来实现。由于两个用户操作各自的账户,因此我们需要创建两个线程完成每个用户的操作。这里我们使用实现Runnable接口的方法来创建线程。
  2. 既然是储户去银行存款,那么可以得出该任务会涉及到三个类,分别是银行类、储户类和测试类。
  3. 定义一个实体类作为账务的集合,包括用户名、登录名、登录密码、钱包、取钱时间和存钱时间等字段。
  4. 在银行类中需要定义一个账户的实体类、一个存钱的方法、一个取钱的方法、查询余额的方法和获取当前用户的方法。获取当前用户方法需要使用synchronized线程锁判断是哪一位用户,在存钱和取钱的方法中先调用获取用户方法判断操作者,再进行存取钱操作,需要注意的是在进行取钱操作时,需要判断余额是否大于需要取的钱数。
  5. 在测试类中使用for循环调用线程模拟用户存取钱操作。

【案例代码】

  1. 创建用户类

 定义一个用户的类,根据用户实现多人同时存取钱功能,如文件8-1所示。

文件8-1  User.java

  1. package chapter0803;
  2. import java.util.Date;
  3. public class User {
  4.      private String u_name;//用户名
  5.         private String u_login_name;//登录名 卡的id
  6.         private String u_login_pwd;//登录密码
  7.         private String u_wallet;//钱包
  8.         private Date  draw_money_time;//取钱时间
  9.         private Date  save_money_time;//存钱时间
  10.         public User(){}
  11.         public User(String u_name, String u_login_name, String u_login_pwd,
  12.                       String u_wallet) {
  13.             this.u_name = u_name;
  14.             this.u_login_name = u_login_name;
  15.             this.u_login_pwd = u_login_pwd;
  16.             this.u_wallet = u_wallet;
  17.         }
  18.         public User(String u_name, String u_login_name, String u_login_pwd,
  19.              String u_wallet, Date draw_money_time, Date save_money_time) {
  20.             this.u_name = u_name;
  21.             this.u_login_name = u_login_name;
  22.             this.u_login_pwd = u_login_pwd;
  23.             this.u_wallet = u_wallet;
  24.             this.draw_money_time = draw_money_time;
  25.             this.save_money_time = save_money_time;
  26.         }
  27.         public String getU_name() {
  28.             return u_name;
  29.         }
  30.         public void setU_name(String u_name) {
  31.             this.u_name = u_name;
  32.         }
  33.         public String getU_login_name() {
  34.             return u_login_name;
  35.         }
  36.         public void setU_login_name(String u_login_name) {
  37.             this.u_login_name = u_login_name;
  38.         }
  39.         public String getU_login_pwd() {
  40.             return u_login_pwd;
  41.         }
  42.         public void setU_login_pwd(String u_login_pwd) {
  43.             this.u_login_pwd = u_login_pwd;
  44.         }
  45.         public String getU_wallet() {
  46.             return u_wallet;
  47.         }
  48.         public void setU_wallet(String u_wallet) {
  49.             this.u_wallet = u_wallet;
  50.         }
  51.         public Date getDraw_money_time() {
  52.             return draw_money_time;
  53.         }
  54.         public void setDraw_money_time(Date draw_money_time) {
  55.             this.draw_money_time = draw_money_time;
  56.         }
  57.         public Date getSave_money_time() {
  58.             return save_money_time;
  59.         }
  60.         public void setSave_money_time(Date save_money_time) {
  61.             this.save_money_time = save_money_time;
  62.         }
  63.     }
  1. 创建银行业务类

 定义一个业务类,实现用户的存取钱功能,如文件8-2所示。

文件8-2 Bank.java

  1. package chapter0803;
  2. import java.math.BigDecimal;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.List;
  7. public class Bank {
  8.       private List<User> userList=new ArrayList<User>();
  9.         public  Bank(List<User> userList) {
  10.              this.userList = userList;
  11.         }
  12.         public  List<User> getUserList() {
  13.             return userList;
  14.         }
  15.         public void setUserList(List<User> userList) {
  16.             this.userList = userList;
  17.         }
  18.         //存钱
  19.         public Boolean saveMoney(String card,String pwd,String moneyNum){
  20.             User u=getUserByCard(card);
  21.             synchronized (Bank.class) {
  22.             if (u.getU_login_name().equals(card) &&
  23.                   u.getU_login_pwd().equals(pwd)) {
  24.                         BigDecimal oldData=new BigDecimal(u.getU_wallet());
  25.                         BigDecimal money=new BigDecimal(moneyNum);
  26.                         u.setU_wallet(oldData.add(money).toString());
  27.                         u.setSave_money_time(new Date());
  28.           System.out.println(Thread.currentThread().getName()+"存钱
  29.           ---->"+u.getU_name()+""+new SimpleDateFormat("yyyy-MM-dd
  30.           HH:mm:ss").format(u.getSave_money_time())+"["+moneyNum+"]钱,余额:
  31.           "+u.getU_wallet());
  32.                         return true;
  33.                     }
  34.                 }
  35.             System.out.println(getUserByCard(card).getU_name()+"存钱失败");
  36.           return false;
  37.         }
  38.         //取钱
  39.         public Boolean getMoney(String card,String pwd,String moneyNum){
  40.             User u=getUserByCard(card);
  41.             synchronized (Bank.class) {
  42.             if (u!=null && u.getU_login_name().equals(card) &&
  43.                  u.getU_login_pwd().equals(pwd)) {
  44.                     BigDecimal oldData=new BigDecimal(u.getU_wallet());
  45.                     BigDecimal money=new BigDecimal(moneyNum);
  46.                     if(oldData.compareTo(money)>=0){
  47.                      u.setU_wallet(oldData.subtract(money).toString());
  48.                      u.setDraw_money_time(new Date());
  49.               System.out.println(Thread.currentThread().getName()+"取钱
  50.               ---->"+u.getU_name()+""+new SimpleDateFormat("yyyy-MM-dd
  51.             HH:mm:ss").format(u.getDraw_money_time())+"["+moneyNum+"]
  52.            ,余额:"+u.getU_wallet());
  53.                             return true;
  54.                         }else {
  55.                 System.out.println(getUserByCard(card).getU_name()+"
  56.                                       要取["+moneyNum+"],但余额不足");
  57.                             return false;
  58.                         }
  59.                     }
  60.                 }
  61.             System.out.println(card+"取钱失败");
  62.             return false;
  63.         }
  64.         //查询余额
  65.         public String balanceEnquiry(String card,String pwd){
  66.             for(User u :this.userList){
  67.                 if(u.getU_login_name().equals(card)&&
  68.                     u.getU_login_pwd().equals(pwd)){
  69.                  System.out.println(Thread.currentThread().getName()+":"
  70.                                      +u.getU_name()+"余额:"+u.getU_wallet());
  71.                     return u.getU_wallet();
  72.                 }
  73.             }
  74.             System.out.println(Thread.currentThread().getName()+":"+card+"
  75.                                    操作失败");
  76.             return null;
  77.         }
  78.        //获取当前用户
  79.         public synchronized User getUserByCard(String card){
  80.             for(User u :this.userList){
  81.                 if(u.getU_login_name().equals(card)){
  82.                     return u;
  83.                 }
  84.             }
  85.             return null;
  86.         }
  87.         public void delayTime(Integer nim){
  88.             try {
  89.                 Thread.sleep(nim);
  90.             } catch (InterruptedException e) {
  91.                 e.printStackTrace();
  92.             }
  93.         }
  94.     }
  1. 创建测试类

 定义测试类,在类中创建客户对象,并创建和开启线程执行存取钱操作,如文件8-3所示。

  1. package chapter0803;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class BankText {
  5.       public static void main(String[] args) throws Exception {
  6.             User u = new User("张三", "13246", "123", "100");
  7.             User uu = new User("李四", "4600882", "123", "0");
  8.             List<User> list = new ArrayList<User>();
  9.             list.add(u);
  10.             list.add(uu);
  11.             final Bank atm = new Bank(list);//初始化数据 模拟
  12.             Thread t = new Thread() {
  13.                 public void run() {
  14.                     for (int i = 0; i < 10; i++) {
  15.                         atm.saveMoney("132466", "123", "12");
  16.                         atm.delayTime(250);
  17.                         atm.getMoney("4600882", "123", "14");
  18.                         atm.delayTime(250);
  19.                     }
  20.                 }
  21.             };
  22.             Thread tt = new Thread() {
  23.                 public void run() {
  24.                     for (int i = 0; i < 10; i++) {
  25.                         atm.getMoney("132466", "123", "2");
  26.                         atm.delayTime(250);
  27.                         atm.saveMoney("4600882", "123", "12");
  28.                         atm.delayTime(250);
  29.                     }
  30.                 }
  31.             };
  32.             t.start();
  33.             tt.start();
  34.         }
  35.     }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】-- POSIX信号量

目录 POSIX信号量 sem_init - 初始化信号量 sem_destroy - 销毁信号量 sem_wait - 等待信号量&#xff08;P操作&#xff09; 基于环形队列的生产消费模型 数据结构 - 环形结构 实现原理 POSIX信号量 #问&#xff1a;什么是信号量&#xff1f; 1. 共享资源 -> 任何一…

2. 驱动开发--驱动开发环境搭建

文章目录前言一、Linux中配置编译环境1.1 linux下安装软件的方法1.2 交叉编译工具链的安装1.2.1 测试是否安装成功1.3 设置环境变量1.3.1 将工具链导出到环境变量1.4 为工具链创建arm-linux-xxx符号链接二、 搭建运行开发环境2.1 tftp网络方式加载内核和设备树文件2.2 nfs网络方…

大事很妙,跨境电商用Reddit做营销做测评真的很有用

最近呢&#xff0c;东哥在和一个叫 jens 的海外社媒大佬聊天&#xff0c;聊起了Reddit&#xff0c;其实 Reddit 可是个不错的流量平台&#xff0c;里面有不少宝藏&#xff0c;跟我们国内的贴吧差不多啦。 作为美国热度排名前五的社交网站&#xff0c;流量如此不错的平台&#…

3、Improved Denoising Diffusion Probabilistic Models#

简介论文发现通过一些简单的修改&#xff0c;ddpm也可以在保持高样本质量的同时实现竞争对数可能性&#xff0c;反向扩散过程的学习方差允许以更少的正向传递数量级进行采样&#xff0c;而样本质量的差异可以忽略不计&#xff0c;这对于这些模型的实际部署非常重要。 github链接…

AOF:redis宕机,如何避免数据丢失

由于redis是基于内存的数据库&#xff0c;一旦宕机&#xff0c;数据就会丢失?如何解决&#xff1f; 目前&#xff0c;Redis 的持久化主要有两大机制&#xff0c;即 AOF&#xff08;Append Only File&#xff09;日志和 RDB&#xff08;Redis DataBase&#xff09; 快照。 AO…

SQL零基础入门学习(十四)

上篇&#xff1a;SQL零基础入门学习&#xff08;十三&#xff09; SQL NULL 值 NULL 值代表遗漏的未知数据。 默认地&#xff0c;表的列可以存放 NULL 值。 如果表中的某个列是可选的&#xff0c;那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该…

基于新一代kaldi项目的语音识别应用实例

本文是由郭理勇在第二届SH语音技术研讨会和第七届Kaldi技术交流会上对新一代kaldi项目在学术及“部署”两个方面报告的内容上的整理。如果有误&#xff0c;欢迎指正。 文字整理丨李泱泽 编辑丨语音小管家 喜报&#xff1a;新一代Kaldi团队三篇论文均被语音顶会ICASSP-2023接…

亿级高并发电商项目-- 实战篇 --万达商城项目 十三(编写购物车、优化修改商品、下架商品方法、购物车模块监听修改商品、删除商品消息)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

SSL证书对虚拟主机的用处有哪些?

虚拟主机是指在同一台服务器上&#xff0c;通过不同的域名或IP地址为多个网站提供服务的一种网络主机。而SSL证书则是一种数字证书&#xff0c;它用于加密网站与用户之间的通信&#xff0c;确保数据传输的安全性和完整性。在虚拟主机上&#xff0c;SSL证书有以下几个用处&#…

SQL Server2008详细安装步骤(保姆式教程)

安装包下载 链接&#xff1a;https://pan.baidu.com/s/1Rjx4DHJBeCW2asC_4Kzo6Q?pwdchui 提取码&#xff1a;chui 安装过程 1.解压后使用管理员身份打开安装程序 2.选择全新安装或向现有安装添加新功能 3.确认 4.输入产品密钥&#xff08;上方网盘安装包里有&#xff0…

【路径规划】基于前向动态规划算法在地形上找到最佳路径(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【ArcGIS Pro二次开发】(10):属性表字段(field)的修改

在ArcGIS Pro中&#xff0c;经常会遇到用字段计算器对要素的属性表进行计算。下面以一个例子演示如何在ArcGIS Pro SDK二次开发中实现。 一、要实现的功能 如上图所示的要素图层&#xff0c;要实现如下功能&#xff1a; 当字段【市级行政区】的值为【泉州市】时&#xff0c;将…

用 .NET 启动你的 DJI Ryze Tello 无人机

大疆的 DJI Ryze Tello 是入门级的无人机&#xff0c;不仅在 STEM 教育中有非常广泛的应用&#xff0c;也可以作为编程入门的首选。通过 UDP 协议调用 DJI Ryze Tello SDK 可以让 DJI Ryze Tello 无人机执行起飞&#xff0c;降落&#xff0c;转向以及不同的花式动作。本文将会通…

Parasoft的自动化测试平台到底强在哪?

在如今产品迭代如此之快的大背景下&#xff0c;软件测试这项工作越来越被大家所重视&#xff0c;但是通常情况下大家都是选择在产品上线前再去做测试&#xff0c;这个时候就会面临很多麻烦和挑战。首先&#xff0c;产品已经开发好之后&#xff0c;体量比较大&#xff0c;要从哪…

BurpSuite配置抓取HTTPS数据包

简介 我们在渗透测试的过程中&#xff0c;经常会遇到HTTPS的网站&#xff0c;Burp默认是没有办法抓取HTTPS的包的&#xff0c;想要让Burp抓取Https的包也很好办&#xff0c;只需要浏览器安装相关的证书即可&#xff0c;接下来将配置过程做一个记录。 前置条件&#xff1a; 1.J…

HashMap原理(一):哈希函数的设计

哈希函数的作用与本质 HashMap用来存储存在映射关系的数据对{key, value},在内部通过构造复合数据结构来封装数据对&#xff0c;即 //伪代码&#xff0c;非源码 class Pair<K, V> {public K key;public V value; }假设用来存储数据对的哈希数表为table&#xff0c;数据…

TCP状态转换

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 TCP状态转换专栏&#xff1a;《Linux从小白到大神》《网络编程》 TCP状态转换示意图如下 针对上面的示…

项目结束先别着急庆祝,项目经理还有这些事要做

项目管理生命周期结束阶段的目的是确认项目可交付成果的完成&#xff0c;使项目发起人满意&#xff0c;并向所有参与者和利益相关者传达项目的最终处置和状态。 项目结束确保项目的所有参与者和利益相关者都清楚后续活动&#xff08;如新项目、服务过渡、SLA等&#xff09;&a…

【ChatGPT情商大考验】ChatGPT教我谈恋爱

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

graph在细粒度分类中的应用

目录基于Graph-Propagation的相关性学习AAAI2020基于graph的高阶关系发现CVPR2021基于Graph-Propagation的相关性学习AAAI2020 来源&#xff1a;Graph-Propagation Based Correlation Learning for Weakly Supervised Fine-Grained Image Classification&#xff08;这或许是第…