黑马程序员技术交流社区

标题: java -线程间通信 [打印本页]

作者: 马林贺    时间: 2012-5-27 22:00
标题: java -线程间通信
  在介绍线程间通信的时候讲过一个生产者消费者的例子

    假如已经创建 one two  两个生产线程

  public synchronized void set(String name)
    {
          if(fiag)   //定义boolean 变量
       {
        try{this.wait()} catch(Exception e){}           // 问题在这里!
        }
       //省略下面代码  .......
    }
  为什么在讲的时候 当 one 线程等待执行后, two 线程就会执行起来  也会执行try 里面的内容 开始等待   
  函数 不是已经被 synchronized  修饰过了吗?  必须等 one 线程出去后 才能执行 two 线程吗?  
   求高人指导一下!

作者: 马林贺    时间: 2012-5-27 22:08
  求解释。。。。
作者: 徐炯    时间: 2012-5-27 22:33
首先,方法上加入了synchroized关键字,则整个方法(方法中的代码块)的执行流程是同步的,即只有当一个线程执行完毕之后才能允许另外一个线程进入。
作者: 张晨    时间: 2012-5-27 23:06
wait()方法会释放该锁
作者: 揭耀祖    时间: 2012-5-28 00:06
public synchronized void set(String name)
    {
          if(fiag)   //定义boolean 变量
       {
        try{this.wait()} catch(Exception e){}          // 当这个线程进入等待状态后,它不仅会释放执行权,而且还将不再持有锁,所以线程二就能执行下去了。        
       //省略下面代码  .......
    }

作者: 罗文杰    时间: 2012-5-28 02:15
本帖最后由 罗文杰 于 2012-5-28 02:18 编辑

这个方法被synchronized修饰过了,书面语就是同步过了。
我自己的理解就是上了个锁,首先一线程这个哥们一进来就把这锁给锁上了,这个时候其他线程的哥们想进来一看被锁住了,只能在外面干着急,当一线程这哥们执行到wait()时,他知道他该等一会儿,休息一会儿,但是你想他休息一会儿的时候,外面可有一群哥们在那狂叫唤要进来么,说句难听的- -他休息着的时候还不让人进来干活不就相当于拉完了屎还站着茅坑么,所以这个时候一线程这个哥们执行wait(),方法时候会把执行权释放掉,这时候这个锁就开了,其他哥们就能进来了,按照排队顺序(当然这也得看CPU老大的脸色- -!),线程二这哥们就进去执行了,不过这哥们进去也是先把这锁锁上了,其他哥们又在外面叫唤了,哈哈。
作者: 马林贺    时间: 2012-5-28 08:28
明白了,谢谢大家了。




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