黑马程序员技术交流社区

标题: 请教大家一个线程间通信的问题 [打印本页]

作者: 沙漠里的小鱼    时间: 2012-2-25 03:41
标题: 请教大家一个线程间通信的问题
本帖最后由 沙漠里的小鱼 于 2012-2-26 15:04 编辑

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)
                                        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();
        }
}
private Res r ;
这句话什么意思呢 为什么要加private  还有 Res不是类吗 为什么不这样写 Res r =new Res() 还有  
Input(Res r)
        {
                this.r = r;
        }
这个不是构造方法吗    其中Res r 什么意思 啊
作者: tanlei200620    时间: 2012-2-25 04:03
private Res r ;  这是一条声明语句,加上  private 是怕外界随便修改 这个引用,因为上述两个线程的锁对象 必须是一个对象才能 实现相互通信,这也是不(Res r =new Res() )的原因。后面的     Input(Res r)
         {
                this.r = r;
        }
语句块的作用就是把InputOutputDemo的main放中定义的Res类对象 r 赋值到 Input 对象中,也必须赋值到Output 对象中才实现相互通信。

private Res r ;   不建议这样写,因为容易出异常,通常都是声明的时候 一起赋值,可以改进为   private Res r = null;          切记
作者: 沈样    时间: 2012-2-25 08:18
我觉得这边写这个是为了控制外部对内部的访问,把不要暴露出去的全部写private
作者: 朱皓    时间: 2012-2-25 08:24
private Res r ;  这是一条声明语句,这样定义,而不这样private Res r =new Res() 是为了不创建新的对象,而在主函数里面创建,使两个线程公用一个资源
private Res r ;这个的目的就是为了拿到主线程创建的资源而设置的引用
Input(Res r)
        {
                this.r = r;
        }
这个就是通过构造函数把资源给input这个线程

作者: 许圣建    时间: 2012-2-26 02:23
老东西了啊,你见过这个吧:
  1. class Person
  2. {
  3.         //属性
  4.         private String name;
  5.         Person(String name)
  6.         {
  7.                 this.name=name                }
复制代码
只是这里的name变成了一个引用变量r而已。
貌似兄弟对参数,和变量的概念也不太清楚,参数是需要别人给的,变量是给别人的,变量的数据可以传递给参数。
这里构造函数获取了一个外部在调用构造函数时传递进来的name,然后通过this.name=name;将它的内容赋给给对象的属性this.name,
以此来初始化所要创建的对象,使他一创建就打上了name的烙印。
作者: 沙漠里的小鱼    时间: 2012-2-26 11:39
本帖最后由 沙漠里的小鱼 于 2012-2-26 15:06 编辑
许圣建 发表于 2012-2-26 02:23
老东西了啊,你见过这个吧:只是这里的name变成了一个引用变量r而已。
貌似兄弟对参数,和变量的概念也不太 ...


哎  我还是不怎么理解啊  能不能在讲讲啊
作者: 沙漠里的小鱼    时间: 2012-2-26 15:05
tanlei200620 发表于 2012-2-25 04:03
private Res r ;  这是一条声明语句,加上  private 是怕外界随便修改 这个引用,因为上述两个线程的锁对象 ...

兄弟 能不能在讲讲啊 我还是不大理解啊
作者: 许圣建    时间: 2012-2-26 18:20
我没从头看,就从主函数说吧:
public static void main(String[] args)
        {
                Res r = new Res();//因为希望in和out是同一个资源对象,所以在这里创建一个对象

                Input in = new Input(r);//将资源对象r分别传递给新建的in,out对象,这样这两个对象就可以操作r了
                Output out = new Output(r);//面向对象下,能执行操作的是对象,
//对象要操作别个对象就只能先拿到引用,要么自己建一个新的,要么接收一个别人建好的

                Thread t1 = new Thread(in);//显然这里in,out都是Runnable接口的子类对象
                Thread t2 = new Thread(out);//in,out中都实现(覆写)了run方法

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




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