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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Res
  2. {
  3.         String name;
  4.         String sex;
  5.         boolean flag = false;
  6. }

  7. class Input implements Runnable
  8. {
  9.         private Res r ;
  10.         Input(Res r)
  11.         {
  12.                 this.r = r;
  13.         }
  14.         public void run()
  15.         {
  16.                 int x = 0;
  17.                 while(true)
  18.                 {
  19.                         synchronized(r)
  20.                         {

  21.                                 if(r.flag)
  22.                                         try{r.wait();}catch(Exception e){}
  23.                                 if(x==0)
  24.                                 {
  25.                                         r.name="mike";
  26.                                         r.sex="man";
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         r.name="丽丽";
  31.                                         r.sex = "女女女女女";
  32.                                 }
  33.                                 x = (x+1)%2;
  34.                                 r.flag = true;
  35.                                 r.notify();
  36.                         }
  37.                 }
  38.         }
  39. }

  40. class Output implements Runnable
  41. {
  42.         private Res r ;
  43.        
  44.         Output(Res r)
  45.         {
  46.                 this.r = r;
  47.         }
  48.         public void run()
  49.         {
  50.                 while(true)
  51.                 {
  52.                         synchronized(r)
  53.                         {
  54.                                 if(!r.flag)
  55.                                         try{r.wait();}catch(Exception e){}
  56.                                 System.out.println(r.name+"...."+r.sex);
  57.                                 r.flag = false;
  58.                                 r.notify();
  59.                         }
  60.                 }
  61.         }
  62. }


  63. class  InputOutputDemo
  64. {
  65.         public static void main(String[] args)
  66.         {
  67.                 Res r = new Res();

  68.                 Input in = new Input(r);
  69.                 Output out = new Output(r);

  70.                 Thread t1 = new Thread(in);
  71.                 Thread t2 = new Thread(out);

  72.                 t1.start();
  73.                 t2.start();
  74.         }
  75. }
复制代码
我没看懂的是两个实现Runnable接口的类中run()前面的代码是干什么用的,只知道毕老师说这样保证的是Res对象的唯一性,为什么?

3 个回复

倒序浏览
2个run访问同一个r里面数据  如果不用r直接用new Res()   那么2个run就得创建2个Res对象   你操作你的我操作我的完全没关系   针对这种需要同步数据的就要使用同一个对象
回复 使用道具 举报
boboyuwu 发表于 2015-8-18 23:17
2个run访问同一个r里面数据  如果不用r直接用new Res()   那么2个run就得创建2个Res对象   你操作你的我操 ...

那是不是这样,主函数创建了一个Res对象,既然要保证Res对象的唯一,两个函数就创建该类对象记录住r首地址值,然后构造函数初始化?
回复 使用道具 举报
构造函数啊,初始化的时候是带着属性的啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马