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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨千里 于 2012-9-24 17:56 编辑

import java.util.concurrent.locks.*;
public class ProducerConsumerDemo2
{
             public static void main(String[] args)
            {
                          //创建四个线程,并启动,两个生产者,两个消费者
                          Resource1 r = new Resource1();
                          Producer1 pro = new Producer1(r);
                          Consumer1 con = new Consumer1(r);

                          Thread t1 = new Thread(pro);
                          Thread t2 = new Thread(pro);
                          Thread t3 = new Thread(con);
                          Thread t4 = new Thread(con);

                    t1.start();
                          t2.start();
                          t3.start();
                          t4.start();
             }




    }
    class Resource1
    {
                private String name;
                private int count = 1;
                private boolean flag = false;




               private Lock lock = new ReentrantLock();
               private Condition condition_pro = lock.newCondition();//
    创建生产锁
               private Condition condition_con = lock.newCondition();//创建消费锁

          public void set(String name)throws InterruptedException
             {
                        lock.lock();   
    //获取锁
                       try
                      {  
                               while(flag)
                                      condition_pro.await(); //
    生产等待
                             this.name = name +"--"+count++;
                             System.out.println(Thread.currentThread().getName()+"-------生产者-------"+this.name);
                             flag = true;
                            condition_con.signal();    //
    唤醒对方的锁
                     }
                    finally
                   {
                           lock.unlock();
    //释放锁
                    }
              }
              public void out()throws InterruptedException
             {
                   lock.lock();
                   try
                   {
                          while(!flag)
                          condition_con.await();//
    消费等待
                          System.out.println(Thread.currentThread().getName()+"+++消费者+++"+this.name);
                          flag = false;
                          condition_pro.signal();//唤醒对方的锁
                 }
                finally
               {
                         lock.unlock();//释放锁
               }
          }
    }

    //下面的两段代码是生产者和消费者
    class Producer1 implements Runnable         
    {

      private Resource1 res;
             Producer1 (Resource1 res)
            {
                   this.res = res;
             }
            public void run()
           {
                   while(true)
                  {
                          try
                         {
                                   res.set("商品");
                         }
                         catch (InterruptedException e)

                  {

                  }
                }
           }
    }
    class Consumer1 implements Runnable
    {

       private Resource1 res;
              Consumer1 (Resource1 res)
             {
                      this.res = res;
              }
             public void run()
             {
                      while(true)
                     {  
                             try
                             {
                                    res.set("商品");
                              }
                               catch (InterruptedException e)
                              {
                              }
                    }
             }
    }

    没有发现代码错误,但运行时出现了死锁,why?

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
你生产者和消费者都在set(商品)啦,没有out   应该消费者是out(商品)
改过来就好啦

点评

我赶上来了 我的技术分  发表于 2012-9-24 17:37

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
滔哥 + 1
杨千里 + 10 赞一个!

查看全部评分

回复 使用道具 举报
赵永康 发表于 2012-9-24 16:13
你生产者和消费者都在set(商品)啦,没有out   应该消费者是out(商品)
改过来就好啦 ...

哦  多谢,昨晚我检查了好久 都没发现是哪里出错了?

看来检查代码是一件很痛苦的事情。


我以后写代码得应该严谨些
回复 使用道具 举报
我晕,我昨天下午弄了老半天都没看出来,原来是这写错了!哎!最重要的调用给忽略了啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马