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

代码如下所示,为何注释掉32行的else后,程序就能正常交替输出mike和丽丽,但是有这个else就不行,输出是一片的mike和一片的丽丽???求大神指点,困扰半天了。。。。
//资源
class Resource
{
        String name;
        String sex;
        boolean flag=false;
}
//输入
class Input implements Runnable
{       
        Resource r;
        Input(Resource r)
        {
                 this.r=r;
        }
        public void run()
        {
                int x=0;  
                while(true)
                {
                        synchronized(r)
                        {
                                if(r.flag)
                                {
                                        try
                                                {
                                                        r.wait();
                                                }
                                        catch (InterruptedException e)
                                                {}       
                                }
                      else
                                {
                                        if(x==0)
                                        {
                                                r.name="mike";
                                                r.sex="nan";
                                        }
                                        else
                                        {
                                                r.name="丽丽";
                                                r.sex="女";
                                        }
                                        r.flag=true;
                                        r.notify();
                                }
                               
                        }
                        x=(x+1)%2;
                }
        }
}


//输出
class  Output implements Runnable
{
        Resource r;
        Output(Resource r)
        {
                this.r=r;
        }
        public void run()
        {  
                while(true)
                {
                        synchronized(r)
                        {
                               
                                if(!r.flag)
                                {
                                        try{r.wait();}
                                        catch (InterruptedException e){}
                                }
                                else
                                {
                                        System.out.println(r.name+"....."+r.sex);
                                        r.flag=false;
                                        r.notify();
                                }
                               
                        }
                       
                }
        }
}

class ResourceDemo
{
        public static void main(String[] args)
        {
                //创建资源。
                Resource r=new Resource();
                //创建任务。
                Input in=new Input(r);
                Output out=new Output(r);
                //创建线程。
                Thread t1=new Thread(in);
                Thread t2=new Thread(out);
                //开启线程。
                t1.start();
                t2.start();
        }
}

2 个回复

倒序浏览
不明觉厉啊,来看代码的
回复 使用道具 举报
/*当注释掉else的时候,执行过程是:
                                (1)b=false,x=0进入赋值线程,第一次赋值mike-nan,
                                        然后b=true,x=1;此时赋值线程被锁,输出线程解锁。
                                (2)b=true进入输出线程,输出mike-nan,然后
                                        b=false,输出线程被锁,赋值线程解锁;
                                (3)b=false,x=1进入赋值线程,第二次赋值丽丽-女,
                                        然后b=true,x=1;此时赋值线程被锁,输出线程解锁。
                                (4)b=true进入输出线程,输出丽丽-女,然后
                                        b=false,输出线程被锁,赋值线程解锁;
                                (5)之后无限交替执行:总结起来就是,每个线程执行完自己的功能
                                        之后就会把自己锁住,并且解锁另一线程,然而赋值的功能是
                                        无论b=true还是false都会进行的,所以每次程序进入赋值线程
                                        都会赋值,导致出现交替输出的现象;
                                        但是加上else后就会使得只有b=false才会赋值,所以会出现
                                        输出重复。
                                */
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马