黑马程序员技术交流社区

标题: 一个小问题,师兄们帮忙解释下 [打印本页]

作者: 赵乐    时间: 2013-5-24 13:05
标题: 一个小问题,师兄们帮忙解释下
本帖最后由 赵乐 于 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里面是怎么判断了,有点晕。。帮忙解释下。


作者: 徐启坤    时间: 2013-5-24 13:09
本帖最后由 徐启坤 于 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. }
复制代码

作者: 赵乐    时间: 2013-5-24 13:14
徐启坤 发表于 2013-5-24 13:09

我又重新编辑了下,你说的功能我是知道的。
问题是if()里面是怎么解释的
就是flag  和!flag  分别是什么意思,什么情况才执行this.wait(),什么情况不执行this.wait()直接执行下面的语句。

作者: 王靖远    时间: 2013-5-24 13:26
flag是一个Boolean的标记。例如初始化flag =  true;If(flag)就是If(true)那么条件就成立啊,就会执行下面的语句。 if(!flag) 相当于if(false),条件不成立。执行else、
作者: 赵乐    时间: 2013-5-24 13:28
我自己捋顺了,我刚的问题是 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:36
本帖最后由 谢孔营 于 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>


作者: 赵乐    时间: 2013-5-24 13:40
谢孔营 发表于 2013-5-24 13:36
看来你对线程处理机制有点迷惑。
该问题其实是典型的消费者,生产者的一个引子。
首先是set()的相当于往里 ...

嗯,谢谢,已经懂了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2