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

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

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

正在回答 回答被采纳积分+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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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