假设一个银行的ATM机,它可以允许用户存款也可以取款。现在一个账户上有存款200元,用户A和用户B都拥有在这个账户上存款和取款的权利。用户A将存入100元,而用户B将取出50元,那么最后账户的存款应是250元。实际操作过程如下:
(1) 先进行A的存款操作:
1) 得到账户的存款数额200,耗时2s。
2) 将账户数额增加100,耗时忽略不计
3) 将新生成的账户结果300返回到ATM机的服务器上,耗时2s(2) 再进行B的取款操作:
4) 得到增加后账户存款数额300,耗时2s。
5) 判断取款额是否小于账户余额,若是,则将账户数额减少50,否则抛出异常信息,耗时忽略不计。
6) 将新生成的账户结果250返回到ATM机的服务器上,耗时2s。
请根据以上要求,将A的操作和B的操作分别用线程来表示,编写一个Java程序实现该功能。
class ATM {
private float account;
public ATM(float money) {
this.account = money;
}
public synchronized float getAccount(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return account;
}
public synchronized void deposit(float money){
account+=money;
}
public synchronized void drawMoney(float money) throws Exception {
if (account < money) {
throw new Exception("余额不足");
}
account -= money;
}
}
class UserA extends Thread{
private ATM atm;
private float money;
public UserA(ATM a,float m){
atm=a;
money=m;
}
public void run(){
System.out.println("账户存款数额为:"+atm.getAccount()+"元");
System.out.println("用户A存了"+money+"元" );
try{
atm.deposit(money);
}
catch(Exception e){ }
System.out.println("余额为:"+atm.getAccount()+"元");
}
}
class UserB extends Thread{
private ATM atm;
private float money;
public UserB(ATM a,float m){
atm=a;
money=m;
}
public void run(){
System.out.println("账户存款数额为:"+atm.getAccount()+"元");
System.out.println("用户B取出"+money+"元" );
try{
atm.drawMoney(money);
System.out.println("余额为:"+atm.getAccount()+"元");
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
class TestATM{
public static void main(String[] args) {
ATM a=new ATM(200);
UserA userA=new UserA(a,100);
UserB userB=new UserB(a,50);
userA.start();
try {
userA.join();//当前线程阻塞,直到另一个线程执行完毕后,当前线程解除阻塞
} catch (InterruptedException e) {
userB.start();
}
System.out.println("==================");
userB.start();
try {
userB.join();
} catch (InterruptedException e) {
userA.start();
}
}
}
运行结果: