我把视频里的代码改动下,存10次,取10次。
public class Bank {
private String account;// 账号
private int balance;// 账户余额
public Bank(String account, int balance) {
this.account = account;
this.balance = balance;
}
public int getBalance() {
return balance;
}
@Override
public String toString() {
return "Bank [账号:" + account + ", 余额:" + balance + "]";
}
// 存款
public int random1;// 类中属性可以不指定初值
public synchronized void saveAccount() {//加了synchronized,这段线程就自己串行这段,期间不允许有其他并行的线程
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 修改余额,存1~1000元钱
this.random1 = (int) (Math.random() * 1000 + 1);
this.balance = this.balance + this.random1;
System.out.println("存款后的账户余额为:" + balance);
}
public void drawAccount() {
synchronized (this) {//两个线程用同一把锁,对Bank类的对象加锁。 两个线程操纵同一个bank对象,哪个线程抢到这个对象的使用权,就享受这个对象的锁
// 修改余额,取1~1000元钱
this.balance = this.balance - (int) (Math.random() * 1000 + 1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("取款后的帐户余额:" + balance);
}
}
//取款
public class DrawAccount implements Runnable{
Bank bank;
public DrawAccount(Bank bank){
this.bank=bank;
}
int i=1;
public void run() {
while(i<=10) {
System.out.println("第"+(i++)+"次取款");
if(this.bank.getBalance()<bank.random1) {
System.out.println("余额不足");
break;
}
bank.drawAccount();
}
}
}
//存款
public class SaveAccount implements Runnable{
Bank bank;
public SaveAccount(Bank bank){
this.bank=bank;
}
int i=1;
public void run(){
while(i<=10) {
System.out.println("第"+(i++)+"次存款");
bank.saveAccount();
}
}
}
public class Test {
public static void main(String[] args) {
// 创建帐户,给定余额为1000
Bank bank=new Bank("a001",0);
System.out.println(bank);
//创建线程对象
SaveAccount sa=new SaveAccount(bank);
DrawAccount da=new DrawAccount(bank);
Thread save=new Thread(sa);
Thread draw=new Thread(da);
save.start();
draw.start();
try {
draw.join();
save.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(bank);
}
}银行账户里初始的钱为0,
有两个线程,其中一个线程每次随机存1~1000元钱, 另外一个线程取1-1000元钱,如果余额不够,就取款失败。提示余额不足。
但是我这么写,if(this.bank.getBalance()<bank.random1),如果某次随机要取得钱小于账户余额,就中断取款的循环。 但刚开始就先存一次钱和取一次钱,有可能余额变负数,才判断,并终止取款。
怎么在第一次存取款时就判断第一次存的钱够不够第一次取的,避免余额出现负数?
8
收起
正在回答 回答被采纳积分+1
5回答
1. Java 零基础入门
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程




“第一次取款”怎么会插到“第一次存款”和“存款”之间。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星