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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© BitmapFactory 中级黑马   /  2013-3-1 17:56  /  1225 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张学林 于 2013-3-11 12:05 编辑

毕老师第12天03视频 等待唤醒机制为啥要把flag定义在Res类中,定义在其他地方不行吗?
  1. class Res {
  2.         String name;
  3.         String sex;
  4.         boolean flag = false;
  5. }

  6. class Input implements Runnable {

  7.         private Res r;

  8.         Input(Res r) {

  9.                 this.r = r;
  10.         }

  11.         public void run() {
  12.                 int x = 0;
  13.                 while (true) {

  14.                         synchronized (r) {

  15.                                 if (r.flag)
  16.                                         try {
  17.                                                 r.wait();
  18.                                         } catch (InterruptedException e) {
  19.                                                 // TODO Auto-generated catch block
  20.                                                 e.printStackTrace();
  21.                                         }
  22.                                 if (x == 0) {

  23.                                         r.name = "mike";
  24.                                         r.sex = "man";
  25.                                 } else {
  26.                                         r.name = "丽丽";
  27.                                         r.sex = "女女女女女";
  28.                                 }
  29.                                 x = (x + 1) % 2;
  30.                                 r.flag = true;
  31.                                 r.notify();
  32.                         }
  33.                 }
  34.         }
  35. }

  36. class Output implements Runnable {

  37.         private Res r;

  38.         Output(Res r) {

  39.                 this.r = r;
  40.         }

  41.         public void run() {

  42.                 while (true) {

  43.                         synchronized (r) {

  44.                                 if (!r.flag)
  45.                                         try {
  46.                                                 r.wait();
  47.                                         } catch (InterruptedException e) {
  48.                                                 // TODO Auto-generated catch block
  49.                                                 e.printStackTrace();
  50.                                         }
  51.                                 System.out.println(r.name + "..." + r.sex);
  52.                                 r.flag = false;
  53.                                 r.notify();
  54.                         }
  55.                 }
  56.         }
  57. }

  58. public class InputOutputDemo {

  59.         public static void main(String[] args) {

  60.                 Res r = new Res();

  61.                 Input in = new Input(r);
  62.                 Output out = new Output(r);

  63.                 Thread t1 = new Thread(in);
  64.                 Thread t2 = new Thread(out);

  65.                 t1.start();
  66.                 t2.start();
  67.         }

  68. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
因为这个程序需要交替执行,执行一个input就要执行一个output,把flag定义在res中可以实现共享,也就是Input和Output公用一个flag,
当一个程序执行时,另一个程序等待。
放在其他类中就无法实现flag共享,也就无法控制input和output交替执行。
回复 使用道具 举报
寇弘禄 发表于 2013-3-1 18:13
因为这个程序需要交替执行,执行一个input就要执行一个output,把flag定义在res中可以实现共享,也就是Inpu ...

根据你的回答从网上搜到的下面这句话
既然两个类都需要用这个属性,可以将这些字段提取到基类的字段,只要初始化一边,以后所有子类都可以使用
回复 使用道具 举报
本帖最后由 寇弘禄 于 2013-3-2 10:00 编辑

基类就是父类,一个类的子类会继承其父类的所有非私有方法和属性,但是不能为了用到某个类的一个属性或方法就去继承这个类,
比如人需要用到猫叫这个方法,但是人不能继承猫,只需要找到一个猫再用他的猫叫方法。
这个程序中如果下面两个类都继承了Res这个类,那么它们俩确实都具有了flag这个属性,但是它们俩用的不是同一个,而是各自类中都有一个,
就比如Person中都有name属性,并在Person中初始化为“张三”,Student继承Person,Student就有了name这个属性,但是在一个Student中的name属性值
可能更改为“李四”,而另一个Student的name属性值可能改为“王五”。
在这个程序中,它们两个中的flag属性都初始化为false,当执行到38行和68行的时候,input中的flag变为true,output中的变为false,而且始终保持不
变了,当两个线程都再次循环到if语句时,两个线程都等待了,程序就死锁了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马