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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xclyijin 中级黑马   /  2015-7-28 11:42  /  198 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

  4. class BoundedBuffer {
  5.    final Lock lock = new ReentrantLock();
  6.    final Condition notFull  = lock .newCondition();
  7.    final Condition notEmpty = lock .newCondition();

  8.    final Object[] items = new Object[100];
  9.    int putptr, takeptr , count ;

  10.    public void put(Object x) throws InterruptedException {
  11.      lock.lock();
  12.      try {
  13.       
  14.          items[putptr ] = x;
  15.          if (++putptr == items.length) putptr = 0;
  16.          ++ count;
  17.          notEmpty.signal();
  18.       } finally {
  19.         lock.unlock();
  20.      }
  21.    }

  22.    public Object take() throws InterruptedException {
  23.       lock.lock();
  24.       try {
  25.        while (count == 0)
  26.          notEmpty.await();
  27.        Object x = items[takeptr];
  28.        if (++takeptr == items.length) takeptr = 0;
  29.        -- count;
  30.        notFull.signal();
  31.        return x;
  32.      } finally {
  33.        lock.unlock();
  34.      }
  35.    }
复制代码

这是视频中生产者和消费者的问题,这段代码打印我复制后用Eclipse运行的结果是每生产100只后再消费100只;
可是如果是这样的话,不是应该改成while (count == items.length)
{notEmpty.signal();
notFull.await();}

while(count==0)
    {notFull.signal();
     notEmpty.await();}吗??我这样改后运行了一下,结果是一样的。但是上面那样写我想不太明白。求解答。

1 个回复

倒序浏览
第一个try后没用判断等待条件,认为让程序等待试一下呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马