----------------------android培训、java培训、期待与您交流! ----------------------
这个代码在java的 api 中的 Condition 这个类中。我这里就是解释了一下各个代码的作用觉得这个代码确实有点技术含量所以贴出来;
实现的是一个可阻塞的队列。和线程间的互斥。通信
/** 这里用了两个 Condition 就是为了再发通知的时候是发给 可以放或者可以取的对象
如果只用一个 有多个等着放 发通知则是会唤醒放的。而没有唤醒取的 */
Lock lock = new ReentrantLock();
Condition notFull = lock.newCondition(); // 非空
Condition notEmpty = lock.newCondition(); // 不满
private final Object [] items = new Object[100]; // 缓冲队列宿主
private int count; // 统计缓冲队列中的记录数
private int putptr; // 放数据的下标
private int takeptr; // 取数据的下标
public void put(Object obj){
try {
lock.lock();
while(count == items.length){ // 如果 cont = 100 不能在放了就阻塞
notFull.await();
}
items[putptr] = obj; // 如果能接着放
if(++putptr == items.length) putptr = 0; // 当放到最后一个修改下标 putptr = 0
++count; // 修改 count 的值
notEmpty.signal(); // 通知取的可以取了
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
public Object get(){
try {
lock.lock();
while(count == 0){ // 如果没有数据不能取就等待
notEmpty.await();
}
Object retVal = items[takeptr]; //如果有数据就取出
if(++takeptr == items.length) takeptr = 0; //取出一个下标加一 准备取下一个
--count; // 记录数减一
notFull.signal(); //取出数据后可以接着放通知 放的继续放
return retVal;
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
return null;
}