设计两个个线程模拟存取款操作,其中一个线程每次随机存1~1000元钱, 另外一个线程取1-1000元钱,如果余额不足,则取款失败,提示余额不足。 写出程序(考虑并发问题)。
import java.util.Random;
public class Bank {
private float account;
public Bank(float money) {
this.account = money;
}
public synchronized float getAccount(){
try {
Thread.sleep(1000);
} 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 Bank bank;
private float money;
public UserA(Bank b,float m){
bank=b;
money=m;
}
public void run(){
System.out.println("账户存款数额为:"+bank.getAccount()+"元");
System.out.println("用户A存了"+money+"元" );
try{
bank.deposit(money);
}
catch(Exception e){ }
System.out.println("余额为:"+bank.getAccount()+"元");
}
}
class UserB extends Thread{
private Bank bank;
private float money;
public UserB(Bank b,float m){
bank=b;
money=m;
}
public void run(){
System.out.println("账户存款数额为:"+bank.getAccount()+"元");
System.out.println("用户B想取"+money+"元");
if((bank.getAccount()-money)>0){
System.out.println("用户B取出了"+money+"元" );
}
try{
bank.drawMoney(money);
System.out.println("余额为:"+bank.getAccount()+"元");
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
class TestBank {
public static void main(String[] args) {
Random r=new Random();
float f1=r.nextInt(1000)+1;
float f2=r.nextInt(1000)+1;
Bank a=new Bank(0);
UserA userA=new UserA(a,f1);
UserB userB=new UserB(a,f2);
userA.start();
try {
userA.join();
} catch (InterruptedException e) {
userB.start();
}
System.out.println("==================");
userB.start();
try {
userB.join();
} catch (InterruptedException e) {
userA.start();
}
}
}
运行结果:任意随机