目录
一、题目
二、类图及其关系
三、详细步骤
1.取钱流程
{1}设置同步监视代码块,监视对象: wang. txt
{2}获取老王余额
{3}判断帐户的余额是否足够。
{4}如果ok更新老王余额。不ok,提示余额不足(抛出异常)
2.转帐流程
{1}监视老李文件: li. txt
{2}获取老李的钱
{3}看看li帐户够不够钱
{4}余额不足判断不足--->抛出异常。
{5}计算老李余额: 5000-1600 = 3400
{6}监视老王文件: wang. txt
{7}获取老王的钱: 2500
{8}更新老王的钱:2500+1600=??
{9}更新老李的钱:3400
四、代码
1.文本模拟数据库
package com.gongsi.cn.test2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
//数据库操作类(文本)
public class MoneyDao {
private String target;//li.txt wang.txt
public MoneyDao(String target) {
this.target=target;
}
//获取转账的余额
public int getMoney() throws Exception {
//获取要转账的txt的内容 文件输入流
FileInputStream fis=new FileInputStream(target);
byte[] buff =new byte[1024];
int cnt=0;
String msg;
cnt=fis.read(buff);
int yuer = 0;
if (cnt>0) {
msg=new String(buff,0,cnt);
yuer=Integer.valueOf(msg);
}
return yuer;
}
//更新账户的余额 把余额写入目标帐户
public void saveMoney(int money) throws Exception {
PrintWriter pr = new PrintWriter(target);
pr.print( money );
pr.close();
// //文件输出流
// FileOutputStream fos=new FileOutputStream(target);
// fos.write(money);
// fos.close();
}
// //测试一下
// public static void main(String[] args) throws Exception {
MoneyDao moneyDao=new MoneyDao("C:\\a\\li.txt");
int yuer=moneyDao.getMoney();
System.out.println(yuer);
moneyDao.saveMoney(500);
// String wangTxt = "C:\\a\\li.txt";
// String liTxt = "C:\\a\\wang.txt";
// MoneyDao wangDao = new MoneyDao( wangTxt );
// MoneyDao liDao = new MoneyDao( liTxt );
// wangDao.saveMoney( 850 );//500
// liDao.saveMoney( 1005 );//0
// System.out.println("{ps}写入成功...");
// }
}
2.取钱
package com.gongsi.cn.test2;
import java.io.IOException;
/*
* 取钱任务
* 2.1、类名称: DrawTask类
* 2.2、主要实现取钱的功能。
* 2.3、实现 Runnable 接口。
* 实现 run() 方法。
*/
public class DrawTask implements Runnable {
String target;// 目标账户
int money;// 取多少钱
MoneyDao moneyDao=new MoneyDao(target);// 操作数据库
public DrawTask(String target, int money) {
this.target = target;
this.money = money;
this.moneyDao = new MoneyDao(target);
}
public void draw() throws Exception {
int yuer=0;
synchronized (target) {
yuer = moneyDao.getMoney();
if (yuer< money) {
throw new RuntimeException("余额不足 !!!");
}
moneyDao.saveMoney(yuer - money);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void run() {
try {
System.out.println("ATM正在取钱......");
draw();
System.out.println("取钱成功,请带好您的钱离开");
} catch (Exception e) {
System.out.println("{ATM}取钱失败, 原因:" + e.getMessage());
}
}
}
3.转账
package com.gongsi.cn.test2;
/*
转帐任务类
3.1、类名称: TransferTask类
* 3.2、实现 Runnable 接口
* 实现 run() 方法。
*/
public class TransferTask implements Runnable{
private String src;// 谁转的 源
private String des;// 转去哪 目的
private int money;//你要转多少钱出去
MoneyDao desDao;
MoneyDao srcDao;
public TransferTask(String src,String des,int money) {
this.src=src;
this.des=des;
this.money=money;
srcDao = new MoneyDao( src );
desDao = new MoneyDao( des );
}
public void transfer() throws Exception {
int liMoney;
int wangMoney;
int remain;
synchronized (srcDao) {
//srcDao=new MoneyDao(src);
liMoney=srcDao.getMoney();
if (liMoney<money) {
throw new Exception("您的余额不足!");
}
remain=liMoney-money;
synchronized (desDao) {
//desDao=new MoneyDao(des);
wangMoney=desDao.getMoney();
desDao.saveMoney(wangMoney+money);
}
srcDao.saveMoney(remain);
}
}
@Override
public void run() {
try {
System.out.println("ATM正在转账......");
transfer();
System.out.println("转账成功,请带好您的钱离开");
} catch (Exception e) {
System.out.println("{ATM}转账失败, 原因:" + e.getMessage());
}
}
}
4.测试函数
package com.gongsi.cn.test2;
public class Testmain {
public static void main(String[] args) throws Exception {
//老王: 2500 - 300 = 2200(剩下) [取钱]
//老李: 5000 - 600 = 4400 (剩下) [转账]
//老王: 2200 + 600 = 2800(剩下) [转账]
String wantTxt = "C:\\a\\wang.txt";
String liTxt = "C:\\a\\li.txt";
DrawTask dTask = new DrawTask(wantTxt, 300);
TransferTask tTask = new TransferTask(liTxt,wantTxt, 600);
Thread th1 = new Thread( dTask );
Thread th2 = new Thread( tTask );
th1.start();
Thread.sleep( 10 );
th2.start();
}
}
5.测试结果
可在文本中看到数字的变化