我把视频里的代码改动下,存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 星