我把视频里的代码改动下,存10次,取10次。

我把视频里的代码改动下,存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),如果某次随机要取得钱小于账户余额,就中断取款的循环。   但刚开始就先存一次钱和取一次钱,有可能余额变负数,才判断,并终止取款。

怎么在第一次存取款时就判断第一次存的钱够不够第一次取的,避免余额出现负数?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
提问者 电磁护盾 2019-10-17 19:02:32

http://img1.sycdn.imooc.com//climg/5da8494d0976a32d12880453.jpg

http://img1.sycdn.imooc.com//climg/5da849ab092d5ce812400715.jpg

我又想到一招,我不在后面的run方法里的判断余额是否足够了, 我在drawAccount()方法里判断  随机要取的钱是否大于余额。  我这样是不是就可以满足存10次取10次,每次是1至1000元的条件,是不是还能达到如果钱不够就不取,钱够了继续取钱的效果啊 ?

  • 同学你好,你的理解是正确的~祝学习愉快!
    2019-10-18 10:47:28
提问者 电磁护盾 2019-10-17 18:42:14

http://img1.sycdn.imooc.com//climg/5da8446f0916605911470704.jpg

我之前的问题还是没解决。 random2是Bank类的成员变量,用来接收取款随机数。 

我在Bank类的drawAccount()方法里给它赋值。 

 因此我在第二次取款之前,是拿第一次的取款随机数跟余额比较的,并不是用第二次的取款随机数跟余额比较。 还是有逻辑错误啊。  

 怎么能让if判断里用第二次的取款随机数跟余额比较啊?

提问者 电磁护盾 2019-10-17 18:18:09

不好意思,刚才我大意了,我把random1当成 随机取的钱 了,random1应该是 随机存的钱 。

我再定义一个random2,作为变量名接收随机取的钱,然后改一下后面的判断里的变量。 程序似乎没问题了。

http://img1.sycdn.imooc.com//climg/5da83fcb09eda5ee15960756.jpg

  • 同学你好,很棒呐,学会调整代码的问题也是编程中的很大一部分内容呐,继续加油,祝:学习愉快~
    2019-10-17 18:26:56
  • 提问者 电磁护盾 回复 好帮手慕酷酷 #2
    我之前的问题还是没解决。 random2是Bank类的成员变量,用来接收取款随机数。 我在Bank类的drawAccount()方法里给它赋值。 因此我在第二次取款之前,是拿第一次的取款随机数跟余额比较的,并不是用第二次的取款随机数跟余额比较。 还是有逻辑错误啊。 怎么能让if判断里用第二次的取款随机数跟余额比较啊?
    2019-10-17 18:42:53
提问者 电磁护盾 2019-10-17 18:08:10

http://img1.sycdn.imooc.com//climg/5da83cfc09ca438f16030749.jpg“第一次取款”怎么会插到“第一次存款”和“存款”之间。

提问者 电磁护盾 2019-10-17 17:46:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师