黑马程序员技术交流社区

标题: 进程通信 遇到的一个问题 [打印本页]

作者: 李海    时间: 2012-6-14 23:11
标题: 进程通信 遇到的一个问题
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就不能被赋初值   所以  我认为没有值打印出   
作者: 揭耀祖    时间: 2012-6-15 01:40
t2进程中有这么一句r.notify();
这句会把t1线程给唤醒的,而你在t1中的代码为:
if (r.y )
  try{ r.wait();} catch(Exception e ){}//线程在这唤醒后就会继续往下执行,而不会再去判断if(r.y)了,如果换成while(r.y)的话就会再去判断条件,然后线程又等待了。
明白了这些之后,你就会知道为什么会有值打印出来了,但是打印的不是正确的结果。
作者: 孙浩迪    时间: 2012-6-15 02:15
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线程,进去不满足第一个你设的条件,所以进去不睡眠,往下执行的。


作者: 李海    时间: 2012-6-15 09:06
jxj4227982333 发表于 2012-6-15 01:40
t2进程中有这么一句r.notify();
这句会把t1线程给唤醒的,而你在t1中的代码为:
if (r.y )

  谢谢  




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