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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵乐 中级黑马   /  2013-5-24 13:05  /  1362 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵乐 于 2013-5-24 13:40 编辑

在学毕老师 等待唤醒机制中
  1. <p>class Res
  2. {
  3.   private String name;
  4.   private String sex;
  5.   private boolean flag = false;</p><p> public synchronized void set(String name,String sex)
  6.   {
  7.    if(flag)//这里是怎么解释的,如果什么  然后执行什么
  8.     try{this.wait();}catch(Exception e){}
  9.    this.name = name;
  10.   
  11.    this.sex = sex;
  12.    flag = true;
  13.    this.notify();
  14.   }
  15.   public synchronized void out()
  16.   {
  17.    if(!flag)//这里是怎么解释的,如果什么  然后执行什么
  18.     try{this.wait();}catch(Exception e){}
  19.    System.out.println(name+"........"+sex);
  20.    flag = false;
  21.    this.notify();
  22.   }
  23. }</p>
复制代码
就是代码中set()和out()方法中if里面是怎么判断了,有点晕。。帮忙解释下。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
本帖最后由 徐启坤 于 2013-5-24 13:10 编辑
  1. class Res
  2. {
  3.     private String name;
  4.             private String sex;
  5.             private boolean flag = false;

  6.             public synchronized void set(String name,String sex)
  7.             {
  8.                         if(flag)//一开始为false,表面里面没有数据,就往里面添加数据,如果为真,代表有数据,就进入等待状态
  9.             try{this.wait();}catch(Exception e){}
  10.                         this.name = name;
  11.         this.sex = sex;
  12.                         flag = true;
  13.                         this.notify();
  14.             }

  15.     public synchronized void out()
  16.             {
  17.                         if(!flag)//如果为true的话,说明有数据,就输出数据,如果为false,说明没有数据,必须进入等待状态,等待set输入数据
  18.             try{this.wait();}catch(Exception e){}
  19.         System.out.println(name+"........"+sex);
  20.                         flag = false;
  21.                         this.notify();
  22.             }
  23. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
徐启坤 发表于 2013-5-24 13:09

我又重新编辑了下,你说的功能我是知道的。
问题是if()里面是怎么解释的
就是flag  和!flag  分别是什么意思,什么情况才执行this.wait(),什么情况不执行this.wait()直接执行下面的语句。
回复 使用道具 举报
flag是一个Boolean的标记。例如初始化flag =  true;If(flag)就是If(true)那么条件就成立啊,就会执行下面的语句。 if(!flag) 相当于if(false),条件不成立。执行else、
回复 使用道具 举报
我自己捋顺了,我刚的问题是 if(flag)  flag初始化是 false   所以就是如果是真的情况下才执行this.wait(); 所以刚开始不执行 this.wait(); 直接执行的下面的语句this.name = name,
然后读到第13行flag = true;  把flag赋值为真,  再然后读到if(!flag) 的时候就是 非真》就是假,所以this.wait();不执行  直接执行System.out.println(name+"........"+sex);  然后如此循环

不知道我这样理解对不,我又重新看了下视频。。

回复 使用道具 举报
本帖最后由 谢孔营 于 2013-5-24 13:38 编辑

看来你对线程处理机制有点迷惑。
该问题其实是典型的消费者,生产者的一个引子。
首先是set()的相当于往里放,是生产者,out是消费者,拿出来
然后定义了两个同步函数,该同步函数的锁是this,也就是本对象。明显是一种互斥锁。
并且设置一个标志位,用来标识资源库里有没有有数据
看懂上面的基础上,来分析程序:
class Res

02.{

03.  private String name;

04.  private String sex;

05.  private boolean flag = false;</p><p> public synchronized void set(String name,String sex)

06.  {

07.   if(flag)//这里是怎么解释的,如果什么  然后执行什么//:此处判断资源库里是否有数据,如果没有则需要生产,如果有的话,则this.wait();使线程进入冻结状态,释放锁,和执行权。

08.    try{this.wait();}catch(Exception e){}

09.   this.name = name;//也就是成产数据

10.  

11.   this.sex = sex;

12.   flag = true;//此时资源库里有数据了,要修改标识为true

13.   this.notify();//唤醒对方线程,是对方线程处于激活状态,不一定有执行权。

14.  }

15.  public synchronized void out()

16.  {

17.   if(!flag)//这里是怎么解释的,如果什么  然后执行什么[/color]//此处判断资源库里是否有数据,如果有,则直接取,如果没有的话,则this.wait();使线程进入冻结状态,释放锁,和执行权。


18.    try{this.wait();}catch(Exception e){}

19.   System.out.println(name+"........"+sex);//取数据

20.   flag = false;//取完后,标识该库没有数据了,

21.   this.notify();//激活对方进程,来提醒对方进程该生产了。

22.  }

23.}</p>

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
赵乐 中级黑马 2013-5-24 13:40:07
7#
谢孔营 发表于 2013-5-24 13:36
看来你对线程处理机制有点迷惑。
该问题其实是典型的消费者,生产者的一个引子。
首先是set()的相当于往里 ...

嗯,谢谢,已经懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马