黑马程序员技术交流社区
标题:
等待唤醒机制的问题
[打印本页]
作者:
董志超
时间:
2012-9-28 08:55
标题:
等待唤醒机制的问题
本帖最后由 董志超 于 2012-9-29 07:37 编辑
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)
//毕老师讲如果为真就等待,为什么认定 r.flag 就是真呢?
//此程序的执行结果为一个mike....man , 一个丽丽....女女女女女女 这样交替执行
//将Input里if中的r.glag改为true,Output里if中的 !r.flag改为false在运行,是输出一段 mike....man ,在输出一段丽丽....女女女女女女 。 why?
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();
}
}
作者:
宋旭珂
时间:
2012-9-28 17:00
因为Input类代码块和Output类代码块共用一个r.flag,则刚开始在Input类代码块中r.flag为false,此时t1执行,执行完毕,r.flag为true,t1等待,此时Output类代码块中r.flag为true,t2执行,执行完毕,r.flag为false,此时t2等待,t1执行。之后交替。Input中r.flag为true,t1一直等待,Output中!r.flag改为false后,t2先执行,Output的run方法执行结束,r.notify()唤醒t1,t1执行一次。
作者:
柳彬
时间:
2012-9-28 20:06
本程序声明了两个线程类和一个资源类,该资源实现互斥,
wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
notify() 唤醒在此对象监视器上等待的单个线程。
赋值的类和输出线程对象信息的交替运行,
本人将Input里if中的r.glag改为true,Output里if中的 !r.flag改为false在运行还是那个结果啊,可能是
阁下哪里出问题了
mike....man
丽丽....女女女女女
作者:
董志超
时间:
2012-9-29 07:34
宋旭珂 发表于 2012-9-28 17:00
因为Input类代码块和Output类代码块共用一个r.flag,则刚开始在Input类代码块中r.flag为false,此时t1执行, ...
明白了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2