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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山鹰 中级黑马   /  2013-6-20 20:44  /  1219 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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();
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

4 个回复

正序浏览
Super_Class 发表于 2013-6-20 23:45
while(flag){
                                con_pro.await();
                                

整了好长时间,没整出来,原来是循环的问题,谢谢
回复 使用道具 举报
王磊 发表于 2013-6-20 21:21
应该是while循环主体定义错误。按照楼主这种定义方法,则是循环条件满足,才会执行主体所有语句,不过当满 ...

解决了  谢谢
回复 使用道具 举报
  while(flag){
                                con_pro.await();
                                
                        }
this.name = name + "--" + id++;
                                System.out.println(Thread.currentThread().getName() + "生产者" + this.name );
                                this.flag = true;
                                con_con.signal();
回复 使用道具 举报
应该是while循环主体定义错误。按照楼主这种定义方法,则是循环条件满足,才会执行主体所有语句,不过当满足条件,运行到await()时候,就会冻结线程,后面语句执行不到。

应该用while语句单独控制await()语句,其他的主体部分写到while循环的外面。

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马