我把视频里的代码改动下,存10次,取10次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 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积分~
来为老师/同学的回答评分吧