黑马程序员技术交流社区

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

作者: 山鹰    时间: 2013-6-20 20:44
标题: 线程间通信问题
本帖最后由 Super_Class 于 2013-6-21 00:02 编辑

使用wait() ,notify()方法能运行,改成用Lock的方法不能运行,帮忙看看哪里的错
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resouse {
        
        private String name;
        private int id = 1;
        boolean flag = false;
        
        Lock lock = new ReentrantLock();
        
        Condition con_pro = lock.newCondition();
        Condition con_con = lock.newCondition();
        public void set(String name) throws InterruptedException{
                lock.lock();
                        try {
                                while(flag){
                                con_pro.await();
                                this.name = name + "--" + id++;
                                System.out.println(Thread.currentThread().getName() + "生产者" + this.name );
                                this.flag = true;
                                con_con.signal();
                        }
                }finally{
                        
                        lock.unlock();
                }
        }
        public void con() throws InterruptedException{
                lock.lock();
                        try {
                                while(!flag){
                                con_con.await();
                                System.out.println(Thread.currentThread().getName() + "消费者" + this.name);
                                this.flag = false;
                                con_pro.signal();
                        }
                }finally{
                        lock.unlock();
                }
        }
}

作者: 王磊    时间: 2013-6-20 21:21
应该是while循环主体定义错误。按照楼主这种定义方法,则是循环条件满足,才会执行主体所有语句,不过当满足条件,运行到await()时候,就会冻结线程,后面语句执行不到。

应该用while语句单独控制await()语句,其他的主体部分写到while循环的外面。
作者: Super_Class    时间: 2013-6-20 23:45
  while(flag){
                                con_pro.await();
                                
                        }
this.name = name + "--" + id++;
                                System.out.println(Thread.currentThread().getName() + "生产者" + this.name );
                                this.flag = true;
                                con_con.signal();
作者: 山鹰    时间: 2013-6-21 06:34
王磊 发表于 2013-6-20 21:21
应该是while循环主体定义错误。按照楼主这种定义方法,则是循环条件满足,才会执行主体所有语句,不过当满 ...

解决了  谢谢
作者: 山鹰    时间: 2013-6-21 06:35
Super_Class 发表于 2013-6-20 23:45
while(flag){
                                con_pro.await();
                                

整了好长时间,没整出来,原来是循环的问题,谢谢




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