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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李健09 中级黑马   /  2013-8-8 00:50  /  1132 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李健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里面的初始值是? 前后语句执行的顺序是?
我现在就是搞不明白这个标记是怎么判断的了

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
我现在就是搞不明白这个标记是怎么判断的了
回复 使用道具 举报
首先 flag的初始取值肯定是 false,但是由于在主线程main线程中启动了两个子线程,而这两个子线程谁先运行谁后运行是不确定的,但不管哪个先执行,第一次判断flag肯定是false,如果接下来进入的是第一个线程体的话,flag被置为ture,接下来又随机的进入两个子线程中,如果接下来又进入到第一个子线程,它会首先等待,然后第二个子线程把flag=false;又唤醒第一个子线程,再接下来。。。。。。。。。!!!

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先 flag的初始取值肯定是 false,但是由于在主线程main线程中启动了两个子线程,而这两个子线程谁先运行谁后运行是不确定的,但不管哪个先执行,第一次判断flag肯定是false,如果接下来进入的是第一个线程体的话,flag被置为ture,接下来又随机的进入两个子线程中,如果接下来又进入到第一个子线程,它会首先等待,然后第二个子线程把flag=false;又唤醒第一个子线程,再接下来。。。。。。。。。!!!
回复 使用道具 举报
嗯 谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马