【案例8-3】 模拟银行存取钱
【案例介绍】
1.任务描述
在银行办理业务时,通常银行会开多个窗口,客户排队等候,窗口办理完业务,会呼叫下一个用户办理业务。本案例要求编写一个程序模拟银行存取钱业务办理。假如有两个用户在存取钱,两个用户分别操作各自的账户,并在控制台打印存取钱的数量以及账户的余额。
2.运行结果
运行结果如图8-1所示。
图8-1 运行结果
【案例思路】
通过任务描述和运行结果可以看出,该任务需要使用多线程的相关知识来实现。由于两个用户操作各自的账户,因此我们需要创建两个线程完成每个用户的操作。这里我们使用实现Runnable接口的方法来创建线程。既然是储户去银行存款,那么可以得出该任务会涉及到三个类,分别是银行类、储户类和测试类。定义一个实体类作为账务的集合,包括用户名、登录名、登录密码、钱包、取钱时间和存钱时间等字段。在银行类中需要定义一个账户的实体类、一个存钱的方法、一个取钱的方法、查询余额的方法和获取当前用户的方法。获取当前用户方法需要使用synchronized线程锁判断是哪一位用户,在存钱和取钱的方法中先调用获取用户方法判断操作者,再进行存取钱操作,需要注意的是在进行取钱操作时,需要判断余额是否大于需要取的钱数。在测试类中使用for循环调用线程模拟用户存取钱操作。
【案例代码】
创建用户类
定义一个用户的类,根据用户实现多人同时存取钱功能,如文件8-1所示。
文件8-1 User.java
package chapter0803;import java.util.Date;public class User { private String u_name;//用户名 private String u_login_name;//登录名 卡的id private String u_login_pwd;//登录密码 private String u_wallet;//钱包 private Date draw_money_time;//取钱时间 private Date save_money_time;//存钱时间 public User(){} public User(String u_name, String u_login_name, String u_login_pwd, String u_wallet) { this.u_name = u_name; this.u_login_name = u_login_name; this.u_login_pwd = u_login_pwd; this.u_wallet = u_wallet; } public User(String u_name, String u_login_name, String u_login_pwd, String u_wallet, Date draw_money_time, Date save_money_time) { this.u_name = u_name; this.u_login_name = u_login_name; this.u_login_pwd = u_login_pwd; this.u_wallet = u_wallet; this.draw_money_time = draw_money_time; this.save_money_time = save_money_time; } public String getU_name() { return u_name; } public void setU_name(String u_name) { this.u_name = u_name; } public String getU_login_name() { return u_login_name; } public void setU_login_name(String u_login_name) { this.u_login_name = u_login_name; } public String getU_login_pwd() { return u_login_pwd; } public void setU_login_pwd(String u_login_pwd) { this.u_login_pwd = u_login_pwd; } public String getU_wallet() { return u_wallet; } public void setU_wallet(String u_wallet) { this.u_wallet = u_wallet; } public Date getDraw_money_time() { return draw_money_time; } public void setDraw_money_time(Date draw_money_time) { this.draw_money_time = draw_money_time; } public Date getSave_money_time() { return save_money_time; } public void setSave_money_time(Date save_money_time) { this.save_money_time = save_money_time; } }
创建银行业务类
定义一个业务类,实现用户的存取钱功能,如文件8-2所示。
文件8-2 Bank.java
package chapter0803;import java.math.BigDecimal;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;public class Bank { private List
创建测试类
定义测试类,在类中创建客户对象,并创建和开启线程执行存取钱操作,如文件8-3所示。
package chapter0803;import java.util.ArrayList;import java.util.List;public class BankText { public static void main(String[] args) throws Exception { User u = new User("张三", "13246", "123", "100"); User uu = new User("李四", "4600882", "123", "0"); List
好文阅读
发表评论