java中ArrayBlockingQueue的出队

对于队里的操作,有往其中添加元素,那么就会有取出元素的情况,我们把元素移除的行为称作出队。跟入队一样,出队同样用ArrayBlockingQueue中的方法进行实现:remove()、poll()、take()、poll。下面我们先来简单理解下出队的流程,再就其中两种出队的函数方法带来深入的探索。

1.出队流程

1)初始化情况是队列满的情况。

2)来了一个线程,将队列中第一个元素取走。此时,队列中 putIndex 索引没有变化,而 takeIndex 索引指向了下一个位置。

3)假设又来一条线程执行取出值操作,takeIdex 索引将会指向下一个位置。

4)继续进行出队操作,直到 takeIndex 索引指向最后一个位置

5)再次进行取出时,可以看到似乎有一次回到了原点。这就环形队列队列。

2.出队方法

出队有四个方法,它们分别是remove()、poll()、take()、poll

poll 方法

//获取元素,如果队列没有元素直接返回null
publicEpoll(){
//上锁
finalReentrantLocklock=this.lock;
lock.lock();
try{
//如果队列有元素,调用dequeue获取元素,否则返回null
return(count==0)?null:dequeue();
}finally{
//释放锁资源
lock.unlock();
}
}
//获取元素,如果队列没有元素,有超时时间的等待队列有元素入队
publicEpoll(longtimeout,TimeUnitunit)throwsInterruptedException{
//计算超时时间
longnanos=unit.toNanos(timeout);
//上锁
finalReentrantLocklock=this.lock;
lock.lockInterruptibly();
try{
while(count==0){
if(nanos<=0)
//超时返回null
returnnull;
//带超时时间的条件等待
nanos=notEmpty.awaitNanos(nanos);
}
//未超时并且队列有元素,调用dequeue方法获取元素
returndequeue();
}finally{
//释放锁资源
lock.unlock();
}
}

take 方法

//获取元素,如果队列没有元素,一直等待队列有元素入队
publicEtake()throwsInterruptedException{
//上锁
finalReentrantLocklock=this.lock;
lock.lockInterruptibly();
try{
while(count==0)
//while循环,如果队列没有元素,一直带条件等待
notEmpty.await();
//调用dequeue方法获取元素
returndequeue();
}finally{
//释放锁资源
lock.unlock();
}
}

原文来自:https://www.py.cn

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容