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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李大伟 高级黑马   /  2013-4-17 16:18  /  1378 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李大伟 于 2013-4-18 09:17 编辑

大家帮我看下,我这个为什么一运行什么也不出呢,死循环了吗?
另外我这个  之前用synchronized 的时候 也没看到 生产1个 消费2个的情况啊?跟电脑配置有关么?
已解决,谢谢大家了,已经改完了的代码贴出来了
  1. package day11;

  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;

  5. class Resource2{
  6.         private String name;
  7.         private int count = 1;
  8.         private boolean flag = false;
  9.         private final Lock lock = new ReentrantLock();
  10.         private final Condition condition_pro = lock.newCondition();
  11.         private final Condition condition_con = lock.newCondition();
  12.        
  13.         public void set(String name) throws InterruptedException{
  14.                 lock.lock();
  15.                 try{
  16.                         while(flag)
  17.                                 condition_pro.await();
  18.                                 this.name = name+"--"+count++;
  19.                                 System.out.println(Thread.currentThread().getName()+"......生产者....."+this.name);
  20.                                 flag = true;
  21.                                 condition_con.signal();
  22.                         }       
  23.                         finally{
  24.                         lock.unlock();
  25.                 }
  26.                
  27.         }
  28.         public void out() throws InterruptedException{
  29.                 lock.lock();
  30.                 try {
  31.                                 while(!flag)
  32.                                         condition_con.await();
  33.                                         System.out.println(Thread.currentThread().getName()+"消费者--"+this.name);
  34.                                         flag = false;
  35.                                         condition_pro.signal();
  36.                         }
  37.                 finally{
  38.                         lock.unlock();
  39.                 }
  40.                
  41.         }
  42. }
  43. class Producer2 implements Runnable{
  44.         private Resource2 res;
  45.         Producer2(Resource2 res){
  46.                 this.res = res;
  47.         }
  48.         public void run(){
  49.                 while(true){
  50.                         try{
  51.                                 res.set("商品");
  52.                         }
  53.                         catch (Exception e) {
  54.                        
  55.                         }
  56.                 }
  57.         }
  58. }
  59. class Consumer2 implements Runnable{
  60.         private Resource2 res;
  61.         Consumer2(Resource2 res){
  62.                 this.res = res;
  63.         }
  64.         public void run(){
  65.                 while(true){
  66.                        
  67.                         try{
  68.                                 res.out();
  69.                         }
  70.                         catch(Exception e){
  71.                                
  72.                         }
  73.                         }
  74.         }
  75. }
  76. public class ProducerConsumerDemo2 {

  77.         /**
  78.          * @param args
  79.          */
  80.         public static void main(String[] args) {
  81.                 // TODO Auto-generated method stub
  82.                 Resource2 res = new Resource2();
  83.                
  84.                 Producer2 pro = new Producer2(res);
  85.                 Consumer2 con = new Consumer2(res);
  86.                
  87.                 Thread t1 = new Thread(pro);
  88.                 Thread t2 = new Thread(pro);
  89.                 Thread t3 = new Thread(con);
  90.                 Thread t4 = new Thread(con);
  91.                
  92.                 t1.start();
  93.                 t2.start();
  94.                 t3.start();
  95.                 t4.start();
  96.         }

  97. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 刘胜寒 于 2013-4-17 16:49 编辑

你把其中的while(flag) 换成if就会出现
生产一个 消费两次 或者 生产两次消费一次

回复 使用道具 举报
public synchronized void set(String name) throws InterruptedException{    //去掉 synchronized

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你这个是用jdk1.5以后的锁来解决的,所以不能再在方法上写synchronized 。去掉set方法和out方法上的synchronized 关键字。
还有   condition_con.signalAll(); 应该是   condition_con.signal(); 你只要对方的监视器唤醒一个线程就行了。不需要全部唤醒。消费者线程上的一样也要改

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你那个condition_con.signalAll();和condition_pro.signalAll();中只需要唤醒对方就行了,唤醒全部的话就可能是你的那种情况了。你再试试吧
建议楼主把代码添加入代码框中。方便赋值和阅读
回复 使用道具 举报
沈浩 发表于 2013-4-17 16:49
public synchronized void set(String name) throws InterruptedException{    //去掉 synchronized

兄弟你说的太对了
回复 使用道具 举报
谭威 发表于 2013-4-17 23:49
你这个是用jdk1.5以后的锁来解决的,所以不能再在方法上写synchronized 。去掉set方法和out方法上的synchro ...

收到,谢谢
回复 使用道具 举报
黄玉昆 发表于 2013-4-18 08:34
你那个condition_con.signalAll();和condition_pro.signalAll();中只需要唤醒对方就行了,唤醒全部的话就可 ...

收到老师,我一定注意
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马