在多线程当中,使用Condition对象来标记不同的线程,这样能够灵活的对特定功能的线程进行等待或者唤醒。问题在于:不同的条件是什么时候和不同的线程进行绑定的? 比如下面是帮助文档上面提供的例子,在执行 notFull.await()的时候,哪个线程的Condition是notFull,并不知道啊?class BoundedBuffer { final Lock lock = new ReentrantLock();//锁对象 final Condition notFull = lock.newCondition();//写线程条件 final Condition notEmpty = lock.newCondition();//读线程条件 final Object[] items = new Object[100];//缓存队列 int putptr/*写索引*/, takeptr/*读索引*/, count/*队列中存在的数据个数*/; public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length)//如果队列满了 notFull.await();//阻塞写线程 items[putptr] = x;//赋值 if (++putptr == items.length) putptr = 0;//如果写索引写到队列的最后一个位置了,那么置为0 ++count;//个数++ notEmpty.signal();//唤醒读线程 } finally { lock.unlock(); } }
|
|