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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周世阳 中级黑马   /  2012-8-8 18:33  /  2485 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周世阳 于 2012-8-8 21:35 编辑

代码如下:
public class MainTest {
        private boolean boo=true;

        public void TestOne(){    //方法1:用来执行一个while循环,循环条件是boo
                int i=0;
                while (boo)     //boo变为false后,循环却一直没有结束
                {
                        i++;
                }
                System.out.print(i);
        }

        public void TestTwo(){   //方法2,改变boo的值
                boo=false;
        }

        public static void main(String [] args){
                final MainTest mt =new MainTest();
                Thread t1 = new Thread(new Runnable () {
                        public void run(){
                                mt.TestOne();
                        }
                });

                Thread t2 = new Thread(new Runnable () {
                        public void run () {
                                mt.TestTwo();
                                System.out.print("boo:"+mt.boo);    //输出boo的值,显示结果的确为false
                        }
                });

                t1.start();
                try {
                        Thread.sleep(10);
                } catch (InterruptedException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }
                t2.start();
        }
}




正常情况,10毫秒过后,t2线程启动,程序就会停止,可是很可能t1线程一直没有跳出循环,成为一死循环,t2也输出了boo的确已经改为false了,可是while循环还是继续,不输出i,求助为什么(修改一下,并不是每次都会死循环,是经常我的几率大于30%)

16 个回复

倒序浏览
这代码。。无法看啊。。
回复 使用道具 举报
杨文宇 发表于 2012-8-8 18:36
这代码。。无法看啊。。

刚才编辑出点问题 现在好了
回复 使用道具 举报
本帖最后由 杨文宇 于 2012-8-8 19:50 编辑

public class Test1 {
        private boolean boo=true;

        public void TestOne(){    //方法1:用来执行一个while循环,循环条件是boo
                int i=0;
                while (boo)    //boo为true时候,则一直循环++,为false时退出循环
                {
                        i++;
                        //System.out.println(i);
                }
                System.out.print(i);//这里输出的是i的总值
        }

        public void TestTwo(){   //方法2,改变boo的值
                boo=false;
        }

        public static void main(String [] args){
                final Test1 mt =new Test1();
                Thread t1 = new Thread(new Runnable () {
                        public void run(){//线程只执行一次!!这个要记住
                                mt.TestOne();
                        }
                });

                Thread t2 = new Thread(new Runnable () {
                        public void run () {
                                mt.TestTwo();
                                System.out.print("boo:"+mt.boo);    //输出boo的值,显示结果的确为false
                        }
                });

                t1.start();
                try {
                        Thread.sleep(100);
                } catch (InterruptedException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }
                t2.start();
        }
}


main是线程,所以当t1线程开启时(线程只执行一次!!这个要记住),虽然TestOne里面是一个死循环,但是不影响main往下执行,当往下执行是。则t2线程启动,boo为false,先输出boo:false,然后输出 i 的总值
所以结果为boo:false92146354
我刚才一直以为t1线程开启之后进入死循环,没法执行下一句。看来理解不深


回复 使用道具 举报
杨文宇 发表于 2012-8-8 18:52
//正常情况,10毫秒过后,t2线程启动,程序就会停止,可是t1线程一直没有跳出循环,
//成为一死循环,t2也 ...

我试过在while里放个print就可以跳出,可是为什么不放就跳不出来?
回复 使用道具 举报
周世阳 发表于 2012-8-8 18:57
我试过在while里放个print就可以跳出,可是为什么不放就跳不出来?


试了一下。。发现好多种结果。。。不清楚啊。我没有在方法里面放while的。帮不到你了
回复 使用道具 举报
杨文宇 发表于 2012-8-8 19:16
试了一下。。发现好多种结果。。。不清楚啊。我没有在方法里面放while的。帮不到你了 ...

没关系 谢了
回复 使用道具 举报
周世阳 发表于 2012-8-8 19:26
没关系 谢了

你看看四楼是不是你要的答案

回复 使用道具 举报
杨文宇 发表于 2012-8-8 19:48
你看看四楼是不是你要的答案

t1不应该是一个死循环,while不放print的话就就打印boo:false不打印i的总值,而程序也不会停止
回复 使用道具 举报
周世阳 发表于 2012-8-8 21:22
t1不应该是一个死循环,while不放print的话就就打印boo:false不打印i的总值,而程序也不会停止 ...

boo:false4791412
这是我运行的结果,后面数字是只能是 i 的值
回复 使用道具 举报
杨文宇 发表于 2012-8-8 21:27
boo:false4791412
这是我运行的结果,后面数字是只能是 i 的值

多运行几次,很容易出现死循环
回复 使用道具 举报
我运行了你的程序,都没死过。。
thread(1,10,100,1000)都没死循环
print放到while里面,thread(1),有一次x没打印,可能1ms太短,没来得及打印,再运行一次打印出来了。貌似都没问题啊!
回复 使用道具 举报
黑马张涛 发表于 2012-8-8 22:03
我运行了你的程序,都没死过。。
thread(1,10,100,1000)都没死循环
print放到while里面,thread(1),有 ...


我这里的确出现死循环,大约运行3到5次就有,JDK1.6
回复 使用道具 举报
这个真不明白了,我试了一下楼主的代码运行了20次,没有一次死循环啊
楼主可以贴一下,把print放while里面 循环时候的图吗,我想见一下死循环的图。
我这里一直运行都没有死循环,
回复 使用道具 举报
瞿乐 发表于 2012-8-9 00:18
这个真不明白了,我试了一下楼主的代码运行了20次,没有一次死循环啊
楼主可以贴一下,把print放while里面 ...

把print放进while里是不会死循环的,不放在while里才会
回复 使用道具 举报
周世阳 发表于 2012-8-9 00:20
把print放进while里是不会死循环的,不放在while里才会

碰到这么奇怪的问题就不知道怎么解决了, 我想不通的是,为什么在不同电脑上出现不同的结果,你的四核CPU?  我这里不会出现问题所以也不好怎么调试解决了。楼主可以多调试一下,如将int改为long,和在t2加上个while(mt.boo)调试一下
回复 使用道具 举报
瞿乐 发表于 2012-8-9 00:34
碰到这么奇怪的问题就不知道怎么解决了, 我想不通的是,为什么在不同电脑上出现不同的结果,你的四核CPU ...

i5 四线程
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马