ATM存取机的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java语言编写的ATM存取机的实现(线程的同步)所谓线程同步是指多个线程同时访问某一个共享资源时,需要保证在同一时间最多只能有一个线程访问该资源。本例将以ATM存取一体机采用线程同步与否为例,来向读者展示synchronized关键字的用法。运行效果如下:
1.存、取线程没有采取同步时,执行存取操作时,其工作流程如下:
当前账户中所剩余额为:150.85;存入金额为:700.0
正在操作,请稍等......
查询余额显示,当前可用余额为:150.85;取出金额为:200.0
正在操作,请稍等......
操作成功,存入金额:700.0
当前余额为:850.85元
操作成功,取出金额:200.0
当前余额为:650.85元
2.存、取线程设置为同步时,执行存取操作时,其工作流程如下:
当前账户中所剩余额为:150.85;存入金额为:700.0
正在操作,请稍等......
操作成功,存入金额为:700.0
当前余额为:850.85元
查询余额显示,当前可用余额为850.85;取出金额为:200.0
正在操作,请稍等......
操作成功,取出金额为:200.0
当前余额为:650.85元
【实现过程】
(1)新建项目,取名ATM_Machine(项目名自取,类名一样),并创建一个ATMCashMachines.java文件,实现两次线程对ATM的读取与写入。主要代码如下:
package ATMCashMachines;
public class ATMCashMachines {
public static void main(String[] args) {
Bank bank = new Bank();
SyncBank sbank = new SyncBank();
System.out.println("1.存、取线程没有采取同步时,执行存取操作时,其工作流程如下:");
Thread putThread = new CashMachines(bank, "saveMoney");
Thread takeThread = new CashMachines(bank, "withdrawMoney"); putThread.start();
takeThread.start();
try{
putThread.join();
takeThread.join();
}catch (Exception e){
System.out.println("两线程运行出错:" + e.getMessage());
}
System.out.println();
bank = new Bank();
System.out.println("2.存、取线程设置为同步时,执行存取操作时,其工作流程如下:");
putThread = new CashMachines(sbank, "sync_SaveMoney");
takeThread = new CashMachines(sbank, "sync_WithdrawMoney");
putThread.start();
takeThread.start();
}
}
(2)非同步机制处理,创建Bank.java文件,主要代码如下:package ATMCashMachines;
public class Bank {
private double curveMoney = 150.85;
public void saveMoney(double putThread) {
System.out.println("当前账户中所剩余额为:" + this.curveMoney + ";存入金额为:" + putThread);
System.out.println("正在操作,请稍等......");
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("操作成功,存入金额:" + putThread);
this.curveMoney = this.curveMoney + putThread;
System.out.println("当前余额为:" + this.curveMoney + "元");
}
public void withdrawMoney(double takeThread) {
System.out.println("查询余额显示,当前可用余额为:"+ this.curveMoney + ";取出金额为:" + takeThread);
System.out.println("正在操作,请稍等......");
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("操作成功,取出金额:" + takeThread);
this.curveMoney = this.curveMoney - takeThread;
System.out.println("当前余额为:" + this.curveMoney + "元");
}
}
(3)ATM进行同步机制处理,创建SyncBank.java文件,执行同样的读取和写入操作。主要代码如下:
package ATMCashMachines;
public class SyncBank {
private double curveMoney = 150.85;
public synchronized void sync_SaveMoney(double putThread) { System.out.println("当前账户中所剩余额为:" + this.curveMoney + ";存入金额为:" + putThread);
System.out.println("正在操作,请稍等......");
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("操作成功,存入金额为:" + putThread);
this.curveMoney = this.curveMoney + putThread;
System.out.println("当前余额为:" + this.curveMoney + "元");
}
public synchronized void sync_WithdrawMoney(double takeThread) {