黑马程序员技术交流社区

标题: 线程通信里面的标记问题 [打印本页]

作者: 李健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