黑马程序员技术交流社区
标题:
等待唤醒机制中的标记问题
[打印本页]
作者:
BitmapFactory
时间:
2013-3-1 17:56
标题:
等待唤醒机制中的标记问题
本帖最后由 张学林 于 2013-3-11 12:05 编辑
毕老师第12天03视频 等待唤醒机制为啥要把flag定义在Res类中,定义在其他地方不行吗?
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 (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
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 (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(r.name + "..." + r.sex);
r.flag = false;
r.notify();
}
}
}
}
public 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();
}
}
复制代码
作者:
寇弘禄
时间:
2013-3-1 18:13
因为这个程序需要交替执行,执行一个input就要执行一个output,把flag定义在res中可以实现共享,也就是Input和Output公用一个flag,
当一个程序执行时,另一个程序等待。
放在其他类中就无法实现flag共享,也就无法控制input和output交替执行。
作者:
BitmapFactory
时间:
2013-3-2 08:18
寇弘禄 发表于 2013-3-1 18:13
因为这个程序需要交替执行,执行一个input就要执行一个output,把flag定义在res中可以实现共享,也就是Inpu ...
根据你的回答从网上搜到的下面这句话
既然两个类都需要用这个属性,可以将这些字段提取到基类的字段,只要初始化一边,以后所有子类都可以使用
作者:
寇弘禄
时间:
2013-3-2 09:57
本帖最后由 寇弘禄 于 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语句时,两个线程都等待了,程序就死锁了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2