黑马程序员技术交流社区

标题: 线程死循环求助--非死锁 [打印本页]

作者: 周世阳    时间: 2012-8-8 18:33
标题: 线程死循环求助--非死锁
本帖最后由 周世阳 于 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%)


作者: 杨文宇    时间: 2012-8-8 18:36
这代码。。无法看啊。。
作者: 周世阳    时间: 2012-8-8 18:38
杨文宇 发表于 2012-8-8 18:36
这代码。。无法看啊。。

刚才编辑出点问题 现在好了
作者: 杨文宇    时间: 2012-8-8 18:52
本帖最后由 杨文宇 于 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:57
杨文宇 发表于 2012-8-8 18:52
//正常情况,10毫秒过后,t2线程启动,程序就会停止,可是t1线程一直没有跳出循环,
//成为一死循环,t2也 ...

我试过在while里放个print就可以跳出,可是为什么不放就跳不出来?
作者: 杨文宇    时间: 2012-8-8 19:16
周世阳 发表于 2012-8-8 18:57
我试过在while里放个print就可以跳出,可是为什么不放就跳不出来?


试了一下。。发现好多种结果。。。不清楚啊。我没有在方法里面放while的。帮不到你了
作者: 周世阳    时间: 2012-8-8 19:26
杨文宇 发表于 2012-8-8 19:16
试了一下。。发现好多种结果。。。不清楚啊。我没有在方法里面放while的。帮不到你了 ...

没关系 谢了
作者: 杨文宇    时间: 2012-8-8 19:48
周世阳 发表于 2012-8-8 19:26
没关系 谢了

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


作者: 周世阳    时间: 2012-8-8 21:22
杨文宇 发表于 2012-8-8 19:48
你看看四楼是不是你要的答案

t1不应该是一个死循环,while不放print的话就就打印boo:false不打印i的总值,而程序也不会停止
作者: 杨文宇    时间: 2012-8-8 21:27
周世阳 发表于 2012-8-8 21:22
t1不应该是一个死循环,while不放print的话就就打印boo:false不打印i的总值,而程序也不会停止 ...

boo:false4791412
这是我运行的结果,后面数字是只能是 i 的值
作者: 周世阳    时间: 2012-8-8 21:34
杨文宇 发表于 2012-8-8 21:27
boo:false4791412
这是我运行的结果,后面数字是只能是 i 的值

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


我这里的确出现死循环,大约运行3到5次就有,JDK1.6

作者: 瞿乐    时间: 2012-8-9 00:18
这个真不明白了,我试了一下楼主的代码运行了20次,没有一次死循环啊
楼主可以贴一下,把print放while里面 循环时候的图吗,我想见一下死循环的图。
我这里一直运行都没有死循环,
作者: 周世阳    时间: 2012-8-9 00:20
瞿乐 发表于 2012-8-9 00:18
这个真不明白了,我试了一下楼主的代码运行了20次,没有一次死循环啊
楼主可以贴一下,把print放while里面 ...

把print放进while里是不会死循环的,不放在while里才会
作者: 瞿乐    时间: 2012-8-9 00:34
周世阳 发表于 2012-8-9 00:20
把print放进while里是不会死循环的,不放在while里才会

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

i5 四线程




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