Java 多线程 模拟银行ATM实时存取钱
近期想回顾一些知识:
一、Java 多线程
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
二、区别
- 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)
- 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
- 线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
- 多进程是指操作系统能同时运行多个任务(程序)。
- 多线程是指在同一程序中有多个顺序流在执行。
三、模拟银行ATM存取钱
1、 用户类user,存储用户信息
import java.util.Date;
public class User {private String u_name;//用户名private String u_login_name;//登录名 卡的idprivate 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;}
}
2、 取款类ATM:有取款机的相应功能
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/*** 取款机* 2018/6/8* wtj*/
public class ATM {private List<User> userList=new ArrayList<>();public ATM(){}public ATM(List<User> userList) {this.userList = userList;}public List<User> getUserList() {return userList;}public void setUserList(List<User> userList) {this.userList = userList;}//存钱public Boolean saveMoney(String card,String pwd,String moneyNum){User u=getUserByCard(card);synchronized (ATM.class) {if (u.getU_login_name().equals(card) && u.getU_login_pwd().equals(pwd)) {BigDecimal oldData=new BigDecimal(u.getU_wallet());BigDecimal money=new BigDecimal(moneyNum);u.setU_wallet(oldData.add(money).toString());u.setSave_money_time(new Date());System.out.println(Thread.currentThread().getName()+"存钱---->"+u.getU_name()+"在"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(u.getSave_money_time())+"存["+moneyNum+"]钱,余额:"+u.getU_wallet());return true;}}System.out.println(getUserByCard(card).getU_name()+"存钱失败");return false;}//取钱public Boolean getMoney(String card,String pwd,String moneyNum){User u=getUserByCard(card);synchronized (ATM.class) {if (u!=null && u.getU_login_name().equals(card) && u.getU_login_pwd().equals(pwd)) {BigDecimal oldData=new BigDecimal(u.getU_wallet());BigDecimal money=new BigDecimal(moneyNum);if(oldData.compareTo(money)>=0){u.setU_wallet(oldData.subtract(money).toString());u.setDraw_money_time(new Date());System.out.println(Thread.currentThread().getName()+"取钱---->"+u.getU_name()+"在"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(u.getDraw_money_time())+"取["+moneyNum+"]钱,余额:"+u.getU_wallet());return true;}else {System.out.println(getUserByCard(card).getU_name()+"余额不足");return false;}}}System.out.println(card+"取钱失败");return false;}//查询余额public String balanceEnquiry(String card,String pwd){for(User u :this.userList){if(u.getU_login_name().equals(card)&& u.getU_login_pwd().equals(pwd)){System.out.println(Thread.currentThread().getName()+":"+u.getU_name()+"余额:"+u.getU_wallet());return u.getU_wallet();}}System.out.println(Thread.currentThread().getName()+":"+card+"操作失败");return null;}//获取当前用户public synchronized User getUserByCard(String card){for(User u :this.userList){if(u.getU_login_name().equals(card)){return u;}}return null;}public void delayTime(Integer nim){try {Thread.sleep(nim);} catch (InterruptedException e) {e.printStackTrace();}}
}
3、测试类:模拟多次存取钱
import java.util.ArrayList;
import java.util.List;public class TreadTextMain {public static void main(String[] args) throws Exception {User u = new User("赵云", "132466", "123", "100");User uu = new User("鲁班", "4600882", "123", "0");List<User> list = new ArrayList<>();list.add(u);list.add(uu);ATM atm = new ATM(list);//初始化数据 模拟Thread t = new Thread() {public void run() {
// ATM atm = new ATM(list);for (int i = 0; i < 20; i++) {atm.saveMoney("132466", "123", "12");atm.delayTime(250);atm.getMoney("4600882", "123", "14");atm.delayTime(250);}
// atm.balanceEnquiry("4600882", "123");
// atm.balanceEnquiry("132466", "123");}};Thread tt = new Thread() {public void run() {
// ATM atm = new ATM(list);for (int i = 0; i < 20; i++) {atm.getMoney("132466", "123", "2");atm.delayTime(250);atm.saveMoney("4600882", "123", "12");atm.delayTime(250);}
// atm.balanceEnquiry("4600882", "123");
// atm.balanceEnquiry("132466", "123");}};t.start();tt.start();
// atm.balanceEnquiry("4600882", "123");
// atm.balanceEnquiry("132466", "123");}
}
四、总结
(1)synchronized的使用:synchronized可以使用在方法上,也可以使用在代码块上;如果我们需要用到不同的线程(多线程),注意synchronized(xxx.class){}、synchronized(this){} 后的效果;
看这篇文章https://www.cnblogs.com/huansky/p/8869888.html
(2)线程安全,简单的理解:多线程执行代码的结果,要跟单流程执行代码的结果一样;
Java 多线程 模拟银行ATM实时存取钱相关推荐
- 用Java程序模拟银行ATM机,实现包括存款、取款、查询、转账功能的简单应用
(1)想象现实世界中的相关操作沙及哪些实体呢?一个是储户,一个是ATM机.因 此根据面向对象中的抽象原则,可将其抽象为两个类:代表储户的账户信息类,代表银行 ATM机的ATM类.外加一个主类(负责实例 ...
- Java程序模拟银行ATM机,实现存款、取款、查询、转账功能等操作
一.介绍 ATM柜员机模拟程序 程序的功能点如下: 要求使用图形用户界面: 通过主界面,可以进入管理员界面.用户界面.系统设置界面.退出: 启动软件,可以进入用户模式,也可以进入系统管理模式: 进入系 ...
- Java 多线程 之 银行ATM实例
http://www.verejava.com/?id=16992914422268 package com.thread;import java.util.Scanner;public class ...
- java实现简单银行ATM系统
#ATM系统 ##功能 模拟银行ATM机系统,具有注册.登录功能 用户登录后可实现以下功能: 1)存款 2)取款 3)转账 4)查询 5)退出 ##设计思路 首先,要进行ATM机操作应该具有银行卡和A ...
- 模拟银行ATM存款存取款的相关功能
模拟银行ATM存款存取款的相关功能 具体需求: 模拟.3张银行卡,1001,1002,1003,分别设置密码和余额(可以用9个变里分别保存卡号.密码和余额) 提示用户输入银行卡和密码 如果用户输入正确 ...
- python循环案例:模拟银行ATM存款取款
案例:模拟银行ATM存款取款 1.模拟3张银行卡,1001,1002,1003,分别设置密码和余额(使用列表嵌套字典的方式): 2.提示用户输入银行卡和密码,遍历每张卡的信息验证是否成功: 3.如果用 ...
- java多线程模拟龟兔赛跑,JAVA多线程模拟龟兔赛跑
JAVA多线程模拟龟兔赛跑! class Rabbit extends Thread{ Tortoise tor; int Journey; int RabbitSpeed; public Rabbi ...
- java多线程模拟购买火车票
java多线程模拟购买火车票 本次做的是一个火车票的售卖模拟,不管用户是在窗口还是APP上购买,必然不可能买到同一张票这也就是说一张票的售卖必然是一个线程在操作的,所以,我们在写代码是也要注意这一点 ...
- python循环结构练习(五)—— 模拟银行ATM存款取款
一. 场景描述案例:模拟银行ATM存款取款 1.模拟3张银行卡,1001,1002,1003,分别设置密码和余额(使用列表嵌套字典的方式): 2.提示用户输入银行卡和密码,遍历每张卡的信息验证是否成功 ...
最新文章
- C++ 函数参数传递:传值,传指针,传引用
- 按照文字内容动态设置TableViewCell的高度
- 没答好「进程间通信」,被面试官挂了....
- 微信说中国人的国庆长假 境内游西湖外滩上榜
- AngularJS HTML DOM
- OpenCV中像素逻辑运算:逻辑或运算
- c++读取json文件_[SpringMVC]-SpringMVC架构-07-SpringMVC文件上传
- dojo 七 DOM dojo/dom
- ESXI3.5 单网卡实现iSCSi连接
- java x509certificate2_ASP.NET使用X509Certificate2出现一系列问题的解决方法
- python 复现AC自动机
- Java - String字符串的部分操作
- 模板与泛型编程(二)
- 巧用DictionaryTKey,TValue,完成客户需求
- D16 Group Decimort 2 Mac - 经典复古采样器
- t470键盘拆解_做工保持良好水准 ThinkPad T470笔记本拆机解析
- 海康威视sdk错误码大全
- GITC2016北京站——打造技术狂欢盛宴
- matlab | 程序运行时间
- 新闻发布及管理系统的设计与实现(论文+PPT+源码)