黑马程序员技术交流社区

标题: 请大家帮忙看看 为什么循环进行不下去 [打印本页]

作者: 游兴钟    时间: 2012-4-16 21:59
标题: 请大家帮忙看看 为什么循环进行不下去
class Res
{
        String name;
        String sex;
        boolean flag = false;
}

class Input implements Runnable
{
        private Res r ;
        Input(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                        synchronized(r)
                        {
                                if(r.flag==false)
                                continue;
                                //try{r.wait();}catch(Exception e){}
                                if(x==0)
                                {
                                        r.name="mike";
                                        r.sex="man";
                                }
                                else
                                {
                                        r.name="丽丽";
                                        r.sex = "女女女女女";
                                }
                                 x = (x+1)%2;
                            r.flag = true;
                                        //r.notify();
                        }
                }
        }
}

class Output implements Runnable
{
        private Res r ;
       
        Output(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        synchronized(r)
                        {
                                if(r.flag==false)
                                        continue;//try{r.wait();}catch(Exception e){}
                                System.out.println(r.name+"...."+r.sex);
                                r.flag = false;
                        //r.notify();
                        }
                }
        }
}


class  InputOutputDemo
{
        public static void main(String[] args)
        {
                Res r = new Res();

                Input in = new Input(r);
                Output out = new Output(r);

                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);

                t1.start();
                t2.start();
        }
}
作者: 蒋亮    时间: 2012-4-16 22:40
你不能用对象锁起来调用wait和notify方法啊,你改为this.wait和this.notify不就行了吗?加上括号啊,我键盘坏了,括号打不出来。
作者: 彭盼    时间: 2012-4-16 23:56
本帖最后由 彭盼 于 2012-4-17 00:01 编辑

非静态函数所用的锁是this,静态同步函数用的锁是此方法所在class的字节码文件,这是老师专门讲过的,是你的锁搞错了
作者: 孙国军    时间: 2012-4-17 01:11
class Res
{
        String name;
        String sex;
        boolean flag = false;
}

class Input implements Runnable
{
        private Res r ;
        Input(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                        synchronized(r)
                        {
                                if(r.flag)                        //r.flag==false 因为flag默认值为false,当t1线程执行到这,r.flag==false为true,t1进入冻结状态,flag标记没有改变;
                                //continue;
                                try{r.wait();}catch(Exception e){}
                                if(x==0)
                                {
                                        r.name="mike";
                                        r.sex="man";
                                }
                                else
                                {
                                        r.name="丽丽";
                                        r.sex = "女女女女女";
                                }
                                 x = (x+1)%2;
                            r.flag = true;
                            r.notify();
                        }
                }
        }
}

class Output implements Runnable
{
        private Res r ;
        
        Output(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        synchronized(r)
                        {
                                if(!r.flag)                        //r.flag==false  当t2线程运行时,r.flag==false还是为true,t2进入冻结状态,自此,t1和t2线程都进入冻结状态,                                       try{r.wait();}catch(Exception e){}; //continue
                                System.out.println(r.name+"...."+r.sex);
                                r.flag = false;
                        r.notify();
                        }
                }
        }
}


class  j
{
        public static void main(String[] args)
        {
                Res r = new Res();

                Input in = new Input(r);
                Output out = new Output(r);

                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);

                t1.start();
                t2.start();
        }
}


上方红色字体部分,经过改动
作者: 袁培育    时间: 2012-4-17 08:40
正如楼上所说,你把 两个if(r.flag==false)都改为 if(r.flag)应该就可以开始循环了,但是也只能执行一次,因为循环一次后,flag变为true,到if时就直接continue,进行下一次循环,而flag的值没有被改变,除非出现这种情况,你的t1先执行一次循环还没到改变flag值时,t2开始执行循环,在t2将要执行   r.flag = false;语句时t1先执行了一次这个语句,flag变为true紧接着t2执行一次,将flag右边为false,否则你的循环就会成为一个死循环,其实你的循环已经开始执行了,不信你可以在while和 synchronized之间加一个输出语句就会发现循环一直在执行,只是到if(r.flag)时由于flag为true所以就continue了,就直接下次循环了。







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