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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海 中级黑马   /  2012-6-14 23:11  /  1292 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Place
{
        String name ;
        String sex;
        boolean y  = true ;
}




class InPut implements Runnable
{
        //Object obj= new Object();  你分别new了两个Object类了  操作的根本不是同一个对象
        private Place r;
        InPut(Place r)
        {

                this.r=r ;

        }
        int x=0;
        public  void run() //
        {
                while(true )
                {  
                   synchronized(r  )
                        {
                           if (r.y )
                                 try{ r.wait();} catch(Exception e ){}

                                if (x==0 )
                                {
                                        r.name="lisi";
                                        r.sex="man";
                                }
                                else
                                {
                                        r.name="张三";
                                        // 当我存到这里的时候  Out 就开始去东西了
                                        r.sex="女女女";
                                }
                                x=(x+1 )%2;
                                r.y=false;
                                r.notify();
                        }
                }
        }
}

class OutPut implements Runnable
{
        //Object obj= new Object();
       
        private Place r;
    OutPut(Place r)
        {
          this.r=r ;

        }
        public void run() //
        {
                while (true)  //
                {
                        synchronized(r )
                        {
                                if(!r.y ) // 如果为true的话 就执行了
                             try{ r.wait();} catch(Exception e ){}
                            System.out.println(r.name +"....."+r.sex );
                                 r.y=true  ;
                                 r.notify();
                        }
                }
        }
}


class  TongXinDemo
{
        public static void main(String[] args)
        {
                Place p = new Place();
                InPut in=new InPut(p);
                OutPut  out = new OutPut(p);
                Thread t1= new Thread(in );
                Thread t2= new Thread(out );
                t1.start();
                t2.start();
        }
}

红色部分是我写错的东西    我一开始以为这样是没有值输出的  结果是有值的   为什么? 我的原因:因为一开始y的值为true  t1进程被等待    t2进程占用cpu  看t2的代码可以知道  y一直为true  t1进程没有唤醒过  所以name和sex就不能被赋初值   所以  我认为没有值打印出   

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

3 个回复

倒序浏览
t2进程中有这么一句r.notify();
这句会把t1线程给唤醒的,而你在t1中的代码为:
if (r.y )
  try{ r.wait();} catch(Exception e ){}//线程在这唤醒后就会继续往下执行,而不会再去判断if(r.y)了,如果换成while(r.y)的话就会再去判断条件,然后线程又等待了。
明白了这些之后,你就会知道为什么会有值打印出来了,但是打印的不是正确的结果。

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 赞一个!

查看全部评分

回复 使用道具 举报
package day1;

class Place
{
        String name ;
        String sex;
        boolean y  = true ;
}




class InPut implements Runnable
{
        //Object obj= new Object();  你分别new了两个Object类了  操作的根本不是同一个对象
        private Place r;
        InPut(Place r)
        {

                this.r=r ;

        }
        int x=0;
        public  void run() //
        {
                while(true )
                {  
                   synchronized(r )
                        {
                           if (r.y )
                                 try{ r.wait();} catch(Exception e ){}  //刚进来in就睡眠,放弃执行权。  //第2步: 这里下面的把这里唤醒了。他就不在判断条件了,直接往下走,你要用while()它会先判断条件

                                if (x==0 )  //第2步: 条件满足了,
                                {
                                        r.name="lisi";   //赋值
                                        r.sex="man";
                                }
                                else
                                {
                                        r.name="张三";
                                        // 当我存到这里的时候  Out 就开始去东西了
                                        r.sex="女女女";
                                }
                                x=(x+1 )%2;
                                r.y=false;  //false
                                r.notify();
                        }
                }
        }
}

class OutPut implements Runnable
{
        //Object obj= new Object();
        
     private Place r;
    OutPut(Place r)
        {
          this.r=r ;

        }
        public void run() //
        {
                while (true)  //
                {
                        synchronized(r)
                        {
                             if(!r.y ) // 如果为true的话 就执行了    //out 到这 条件不满足,不走这个if
                             try{ r.wait();} catch(Exception e ){}  
                             
                            System.out.println(r.name +"....."+r.sex ); //第2步的时候,接着打印,以此类推。。。
                                 r.y=true  ;     //到这。。。
                                 r.notify();      //又到这了, 这时候把in线程唤醒了。。。 看上面的第2步。
                        }
                }
        }
}


class  TongXinDemo
{
        public static void main(String[] args)
        {
                Place p = new Place();
                InPut in=new InPut(p);
                OutPut  out = new OutPut(p);
                Thread t1= new Thread(in );
                Thread t2= new Thread(out );
                t1.start();
                t2.start();
        }


你应该是在判断条件那蒙了,你在仔细看看你判断的条件。。 out线程,进去不满足第一个你设的条件,所以进去不睡眠,往下执行的。

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 很给力!

查看全部评分

回复 使用道具 举报
jxj4227982333 发表于 2012-6-15 01:40
t2进程中有这么一句r.notify();
这句会把t1线程给唤醒的,而你在t1中的代码为:
if (r.y )

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