黑马程序员技术交流社区

标题: 生产者,消费者,问题,搞了两个小时不知道哪里错了,求助 [打印本页]

作者: 碎流    时间: 2014-9-15 09:32
标题: 生产者,消费者,问题,搞了两个小时不知道哪里错了,求助
本帖最后由 碎流 于 2014-9-15 19:00 编辑

package cn.fuxi12;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//新特性生产者消费者


class ziYuanb
{
        private String name;
        private int jiShu = 0;
        private boolean bl = false;
        private Lock lock = new ReentrantLock();

        
        private Condition sheng = lock.newCondition();
        private Condition xiao = lock.newCondition();
        
        
        public  void shengc(String name)throws InterruptedException
        {
                lock.lock();
               
               
                try
                {
                        while(bl)
                                sheng.await();  //1   2
                        
                        this.name = name+".."+jiShu++;
        
                        System.out.println(Thread.currentThread().getName()+",,,,,,,生产者"+this.name+jiShu);
                        
                        bl = true;
                        sheng.signal();
                }
                finally
                {
                        lock.unlock();
                }
        }
        public void xiaoc() throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(!bl)
                                xiao.await(); //3
                        System.out.println(Thread.currentThread().getName()+".....消费者"+this.name+jiShu);
                        bl = false;
                        xiao.signal();
                }
                finally
                {
                        lock.unlock();
                }
        }
}

class shengChanZhe implements Runnable
{
        private ziYuanb zy;
        shengChanZhe(ziYuanb zy)
        {
                this.zy = zy;
        }
        public void run()
        {
                while(true)
                {
                        try
                        {
                                zy.shengc("+煎饼果子");
                        } catch (InterruptedException e)
                        {
                                
                        }
                }
        }
}

class xiaoFeiZhe implements Runnable
{
        private ziYuanb zy;
        xiaoFeiZhe(ziYuanb zy)
        {
                this.zy = zy;
        }
        public void run()
        {
                while(true)
                {
                        try {
                                zy.xiaoc();
                        } catch (InterruptedException e) {
                        
                        }
                }
        }
}


public class Demo06 {
        public static void main(String[] args) {
                ziYuanb zy = new ziYuanb();
               
                shengChanZhe sh = new shengChanZhe(zy);
                xiaoFeiZhe xf = new xiaoFeiZhe(zy);
               
                Thread t1 = new Thread(sh);
                Thread t2 = new Thread(sh);
                Thread t3 = new Thread(xf);
                Thread t4 = new Thread(xf);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

本来是自己写的,眼看改的都和毕老师一样了,还是不知道哪里出问题,,,,,输出都会卡住,,,像是死锁,,,,想了两个多小时,实在不知道怎么搞,求指点.....或许可能就是很小的问题,但是就是解决不了..  

作者: 李春丽    时间: 2014-9-15 11:11
本帖最后由 李春丽 于 2014-9-15 11:20 编辑

  1. package cn.fuxi12;

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

  5. //新特性生产者消费者


  6. class ziYuanb
  7. {
  8.          private String name;
  9.          private int jiShu = 0;
  10.          private boolean bl = false;
  11.          private Lock lock = new ReentrantLock();

  12.         
  13.         private Condition sheng = lock.newCondition();
  14.          private Condition xiao = lock.newCondition();
  15.          
  16.         
  17.         public  void shengc(String name)throws InterruptedException
  18.          {
  19.                  lock.lock();
  20.                  
  21.                
  22.                 try
  23.                  {
  24.                          while(bl)
  25.                                  sheng.await();  //1   2
  26.                         
  27.                         this.name = name+".."+jiShu++;
  28.          
  29.                         System.out.println(Thread.currentThread().getName()+",,,,,,,生产者"+this.name+jiShu);
  30.                         
  31.                         bl = true;
  32.                          xiao.signal();
  33.                  }
  34.                  finally
  35.                  {
  36.                          lock.unlock();
  37.                  }
  38.          }
  39.          public void xiaoc() throws InterruptedException
  40.          {
  41.                  lock.lock();
  42.                  try
  43.                  {
  44.                          while(!bl)
  45.                                  xiao.await(); //3
  46.                         System.out.println(Thread.currentThread().getName()+".....消费者"+this.name+jiShu);
  47.                          bl = false;
  48.                          sheng.signal();
  49.                  }
  50.                  finally
  51.                  {
  52.                          lock.unlock();
  53.                  }
  54.          }
  55. }

  56. class shengChanZhe implements Runnable
  57. {
  58.          private ziYuanb zy;
  59.          shengChanZhe(ziYuanb zy)
  60.          {
  61.                  this.zy = zy;
  62.          }
  63.          public void run()
  64.          {
  65.                  while(true)
  66.                  {
  67.                          try
  68.                         {
  69.                                  zy.shengc("+煎饼果子");
  70.                          } catch (InterruptedException e)
  71.                         {
  72.                                  
  73.                         }
  74.                  }
  75.          }
  76. }

  77. class xiaoFeiZhe implements Runnable
  78. {
  79.          private ziYuanb zy;
  80.          xiaoFeiZhe(ziYuanb zy)
  81.          {
  82.                  this.zy = zy;
  83.          }
  84.          public void run()
  85.         {
  86.                  while(true)
  87.                  {
  88.                          try {
  89.                                  zy.xiaoc();
  90.                          } catch (InterruptedException e) {
  91.                         
  92.                         }
  93.                  }
  94.          }
  95. }


  96. public class Demo06 {
  97.          public static void main(String[] args) {
  98.                  ziYuanb zy = new ziYuanb();
  99.                  
  100.                 shengChanZhe sh = new shengChanZhe(zy);
  101.                  xiaoFeiZhe xf = new xiaoFeiZhe(zy);
  102.                  
  103.                 Thread t1 = new Thread(sh);
  104.                  Thread t2 = new Thread(sh);
  105.                  Thread t3 = new Thread(xf);
  106.                  Thread t4 = new Thread(xf);
  107.                  
  108.                 t1.start();
  109.                  t2.start();
  110.                  t3.start();
  111.                  t4.start();
  112.          }
  113. }
复制代码

    try {
                                    while(bl)
                                           sheng.await();  //1   2
            this.name = name+".."+jiShu++;
            System.out.println(Thread.currentThread().getName()+",,,,,,,生产者"+this.name+jiShu);
            bl = true;
            xiao.signal();//sheng.signal();注意,之前是消费者等待,然后,标记设为 false ,就应该让生产者唤醒啦
        }
    建立多个 Condition 对象,使用时要注意分析:谁等待着,需要谁唤醒了

作者: 勇闯黑马    时间: 2014-9-27 10:39




  1. import java.util.concurrent.locks.*;


  2. //新特性生产者消费者


  3. class ziYuanb
  4. {
  5.         private String name;
  6.         private int jiShu = 0;
  7.         private boolean bl = false;
  8.         private Lock lock = new ReentrantLock();

  9.         
  10.         private Condition sheng = lock.newCondition();
  11.         private Condition xiao = lock.newCondition();
  12.         
  13.         
  14.         public  void shengc(String name)throws InterruptedException
  15.         {
  16.                 lock.lock();
  17.                
  18.                
  19.                 try
  20.                 {
  21.                         while(bl)
  22.                                 sheng.await();  //1   2
  23.                         
  24.                         this.name = name+".."+jiShu++;
  25.         
  26.                         System.out.println(Thread.currentThread().getName()+",,,,,,,生产者"+this.name+jiShu);
  27.                         
  28.                         bl = true;
  29.                         xiao.signalAll();
  30.                 }
  31.                 finally
  32.                 {
  33.                         lock.unlock();
  34.                 }
  35.         }
  36.         public void xiaoc() throws InterruptedException
  37.         {
  38.                 lock.lock();
  39.                 try
  40.                 {
  41.                         while(!bl)
  42.                                 xiao.await(); //3
  43.                         System.out.println(Thread.currentThread().getName()+".....消费者"+this.name+jiShu);
  44.                         bl = false;
  45.                        sheng.signalAll();
  46.                 }
  47.                 finally
  48.                 {
  49.                         lock.unlock();
  50.                 }
  51.         }
  52. }

  53. class shengChanZhe implements Runnable
  54. {
  55.         private ziYuanb zy=new ziYuanb();
  56.         shengChanZhe(ziYuanb zy)
  57.         {
  58.                 this.zy = zy;
  59.         }
  60.         public void run()
  61.         {
  62.                 while(true)
  63.                 {
  64.                         try
  65.                         {
  66.                                 zy.shengc("+煎饼果子");
  67.                         } catch (InterruptedException e)
  68.                         {
  69.                                 
  70.                         }
  71.                 }
  72.         }
  73. }

  74. class xiaoFeiZhe implements Runnable
  75. {
  76.         private ziYuanb zy=new ziYuanb();;
  77.         xiaoFeiZhe(ziYuanb zy)
  78.         {
  79.                 this.zy = zy;
  80.         }
  81.         public void run()
  82.         {
  83.                 while(true)
  84.                 {
  85.                         try {
  86.                                 zy.xiaoc();
  87.                         } catch (InterruptedException e) {
  88.                         
  89.                         }
  90.                 }
  91.         }
  92. }


  93. class Demo06 {
  94.         public static void main(String[] args) {
  95.                 ziYuanb zy = new ziYuanb();
  96.                
  97.                 shengChanZhe sh = new shengChanZhe(zy);
  98.                 xiaoFeiZhe xf = new xiaoFeiZhe(zy);
  99.                
  100.                 Thread t1 = new Thread(sh);
  101.                 Thread t2 = new Thread(sh);
  102.                 Thread t3 = new Thread(xf);
  103.                 Thread t4 = new Thread(xf);
  104.                
  105.                 t1.start();
  106.                 t2.start();
  107.                 t3.start();
  108.                 t4.start();
  109.         }
  110. }
复制代码





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