黑马程序员技术交流社区

标题: 大家给我看看这个程序,为什么加上while后打印出不想要的... [打印本页]

作者: 席杰    时间: 2014-8-9 17:09
标题: 大家给我看看这个程序,为什么加上while后打印出不想要的...
本帖最后由 席杰 于 2014-8-10 15:29 编辑

/*
定义一个程序,俩人去银行存钱,每人存300,分3次存。
*/
//银行
class Bank{
        //银行里总共有的钱数
        int totalMoney=0;
        //网银行里存钱
        public void MoneyStore(int money){
                totalMoney=money+totalMoney;
                //打印出哪位顾客存的钱,并打印出银行钱库的总数。
                System.out.println(Thread.currentThread().getName()+"..."+totalMoney);
        }
}
//顾客
class Consumer implements Runnable{
        Bank bank=new Bank();
        //顾客存钱的动作
        public void run(){
                while(true){
                        for(int i=0;i<3;i++){
                                bank.MoneyStore(100);
                        }
                }
        }
}
//主函数
public class Shishi {
        public static void main(String[] args) {
                Consumer consumer=new Consumer();
                Thread t1=new Thread(consumer);
                Thread t2=new Thread(consumer);
                t1.start();
                t2.start();
        }        
}

加上while循环后,程序运行后打印出这样的结果:
Thread-0...16900600
Thread-1...16900700
Thread-0...16900800
Thread-1...16900900
Thread-0...16901000
Thread-1...16901100
Thread-0...16901200
Thread-1...16901300
Thread-0...16901400

......就这样一直打印下去,程序不停。

而去掉while后就打印出正确的结果:
Thread-0...200
Thread-1...200
Thread-0...300
Thread-1...400
Thread-0...500
Thread-1...600


为什么会出现这样的结果啊。加上while循环后不应该一直无限打印啊,因为在run()方法中,for(int i=0;i<3;i++){}也在控制着程序的运行啊。当每个线程运行到i=3,就应该不会继续打印输出啊。为什么还会打印啊!奇怪了,求高手解决,给我讲讲。

作者: 曾宇    时间: 2014-8-9 17:17
while(true){
       for(int i=0;i<3;i++){
       bank.MoneyStore(100);
       }
}
错误地点就在这里了
犯这个错误,就说明你的基础还不够扎实。
流程跟你理一遍,首先,while循环开始。
然后执行for循环。for循环3次。for循环结束。
由于while(true),while继续循环。
继续for。进入无限循环。。。
作者: 地狱天堂    时间: 2014-8-9 17:18
内循环for循环完3次后,外循环while 还在循环,没有条件让while循环停下来。那么内循环for继续从i=0开始循环
作者: 席杰    时间: 2014-8-9 19:55
曾宇 发表于 2014-8-9 17:17
while(true){
       for(int i=0;i

不应该啊,在我逻辑思维,认为既然for循环结束了,它就不应该再从头循环啊,除非再一次调用for循环。
作者: 冒牌高手    时间: 2014-8-9 20:06
while(true){
        for(int i=0;i<3;i++){
        bank.MoneyStore(100);
        }
}
就是这里,你进入while之后,就会进行三次for循环,所以会一直不停打印,打印完成之后就会继续while的循环,但是while的循环不会停止,因为你没设定while循环结束条件。
作者: 程序媛师妹    时间: 2014-8-9 20:27
席杰 发表于 2014-8-9 19:55
不应该啊,在我逻辑思维,认为既然for循环结束了,它就不应该再从头循环啊,除非再一次调用for循环。 ...


明显  while(true){}会陷入死循环 ;P我也看粗来了
而且你for循环里面的i 是在for里面定义的,也就是每次while循环一次for里面的i都初始化为0
作者: Mr.Better    时间: 2014-8-9 20:34
这样就一直循环下去了
作者: 席杰    时间: 2014-8-9 20:53
程序媛师妹 发表于 2014-8-9 20:27
明显  while(true){}会陷入死循环 我也看粗来了
而且你for循环里面的i 是在for里面定义的,也就是每次 ...

你们这么一回答,我就感觉我问的问题特别傻瓜,但是在我的思维里一直认为while(true),不能促使for再次循环,我总以为只有在其他地方从新调用for,for才会再次运行,今天我从新学习线程时,然后自己编程时遇到了这个问题,我一直想不通,大伙这么一说,我才发现我想错了。我的接受这种循环。谢谢你的回答!:)
作者: 程序媛师妹    时间: 2014-8-9 21:52
席杰 发表于 2014-8-9 20:53
你们这么一回答,我就感觉我问的问题特别傻瓜,但是在我的思维里一直认为while(true),不能促使for再次循 ...

:lol一起加油




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2