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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董志超 中级黑马   /  2012-9-28 08:55  /  1274 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 董志超 于 2012-9-29 07:37 编辑

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 就是真呢?
                                                       //此程序的执行结果为一个mike....man , 一个丽丽....女女女女女女 这样交替执行
                                                     //将Input里if中的r.glag改为true,Output里if中的 !r.flag改为false在运行,是输出一段 mike....man  ,在输出一段丽丽....女女女女女女 。 why?


                                        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)
                                        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();
        }
}

3 个回复

倒序浏览
因为Input类代码块和Output类代码块共用一个r.flag,则刚开始在Input类代码块中r.flag为false,此时t1执行,执行完毕,r.flag为true,t1等待,此时Output类代码块中r.flag为true,t2执行,执行完毕,r.flag为false,此时t2等待,t1执行。之后交替。Input中r.flag为true,t1一直等待,Output中!r.flag改为false后,t2先执行,Output的run方法执行结束,r.notify()唤醒t1,t1执行一次。
回复 使用道具 举报
本程序声明了两个线程类和一个资源类,该资源实现互斥,
wait()   在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
notify()  唤醒在此对象监视器上等待的单个线程。
赋值的类和输出线程对象信息的交替运行,
本人将Input里if中的r.glag改为true,Output里if中的 !r.flag改为false在运行还是那个结果啊,可能是
阁下哪里出问题了
mike....man
丽丽....女女女女女
回复 使用道具 举报
宋旭珂 发表于 2012-9-28 17:00
因为Input类代码块和Output类代码块共用一个r.flag,则刚开始在Input类代码块中r.flag为false,此时t1执行, ...

明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马