A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 席杰 于 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,就应该不会继续打印输出啊。为什么还会打印啊!奇怪了,求高手解决,给我讲讲。

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

8 个回复

倒序浏览
while(true){
       for(int i=0;i<3;i++){
       bank.MoneyStore(100);
       }
}
错误地点就在这里了
犯这个错误,就说明你的基础还不够扎实。
流程跟你理一遍,首先,while循环开始。
然后执行for循环。for循环3次。for循环结束。
由于while(true),while继续循环。
继续for。进入无限循环。。。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
内循环for循环完3次后,外循环while 还在循环,没有条件让while循环停下来。那么内循环for继续从i=0开始循环
回复 使用道具 举报
曾宇 发表于 2014-8-9 17:17
while(true){
       for(int i=0;i

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


明显  while(true){}会陷入死循环 ;P我也看粗来了
而且你for循环里面的i 是在for里面定义的,也就是每次while循环一次for里面的i都初始化为0
回复 使用道具 举报
这样就一直循环下去了
回复 使用道具 举报
程序媛师妹 发表于 2014-8-9 20:27
明显  while(true){}会陷入死循环 我也看粗来了
而且你for循环里面的i 是在for里面定义的,也就是每次 ...

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

:lol一起加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马