黑马程序员技术交流社区
标题:
线程通信里面的标记问题
[打印本页]
作者:
李健09
时间:
2013-8-8 00:50
标题:
线程通信里面的标记问题
本帖最后由 李健09 于 2013-8-9 15:07 编辑
毕老师的课件里面的 线程间通信
package com.InOut;
//InputOutputDemo.java 代码优化
class ResYouHua
{
private String name;
private String sex;
private boolean flag=false;
public synchronized void set(String name,String sex)
{
if(flag)
try{this.wait();}//此时的锁是this
catch(Exception e){}
this.name=name;
this.sex=sex;
flag=true;
this.notify();
}
public synchronized void out()
{
if(!flag)
try{this.wait();}
catch(Exception e){}
System.out.println(name+"..."+sex);
flag=false;
this.notify();
}
}
class InputYouHua implements Runnable
{
private ResYouHua r;//资源私有化
InputYouHua(ResYouHua r)//初始化资源
{
this.r=r;
}
public void run()
{
int x=0;
while(true)
{
if(x==0)
r.set("mike","man");
else
r.set("丽丽","女");
x=(x+1)%2;
}
}
}
class OutputYouHua implements Runnable
{
private ResYouHua r;
OutputYouHua(ResYouHua r)//初始化资源
{
this.r=r;
}
public void run()
{
while(true)
{
r.out();
}
}
}
public class YouHuaInputOutputDemo
{
public static void main(String[] args)
{
ResYouHua r=new ResYouHua();//建立资源
new Thread(new InputYouHua(r)).start();
new Thread(new OutputYouHua(r)).start();
}
}
-----------------------------------------------------------------
private boolean flag=false;
if(flag)
try{this.wait();}//此时的锁是this
catch(Exception e){}
this.name=name;
this.sex=sex;
flag=true;
this.notify();//问?此时if里面的初始值是false? 我理解的是false而后执行this.name=name; this.sex=sex;语句返回true 而后停止开始等待, 而后this.notify();唤醒此时的if里面的又是?呢
请帮忙解释下 转不过来了
---------------------------------------
if(!flag)
try{this.wait();}
catch(Exception e){}
System.out.println(name+"..."+sex);
flag=false;
this.notify();//问?此时if里面的初始值是? 前后语句执行的顺序是?
我现在就是搞不明白这个标记是怎么判断的了
作者:
李健09
时间:
2013-8-8 00:51
我现在就是搞不明白这个标记是怎么判断的了
作者:
柳小龙
时间:
2013-8-8 01:59
首先 flag的初始取值肯定是 false,但是由于在主线程main线程中启动了两个子线程,而这两个子线程谁先运行谁后运行是不确定的,但不管哪个先执行,第一次判断flag肯定是false,如果接下来进入的是第一个线程体的话,flag被置为ture,接下来又随机的进入两个子线程中,如果接下来又进入到第一个子线程,它会首先等待,然后第二个子线程把flag=false;又唤醒第一个子线程,再接下来。。。。。。。。。!!!
作者:
柳小龙
时间:
2013-8-8 02:00
首先 flag的初始取值肯定是 false,但是由于在主线程main线程中启动了两个子线程,而这两个子线程谁先运行谁后运行是不确定的,但不管哪个先执行,第一次判断flag肯定是false,如果接下来进入的是第一个线程体的话,flag被置为ture,接下来又随机的进入两个子线程中,如果接下来又进入到第一个子线程,它会首先等待,然后第二个子线程把flag=false;又唤醒第一个子线程,再接下来。。。。。。。。。!!!
作者:
李健09
时间:
2013-8-9 15:06
嗯 谢了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2