入队出队Java,java中ArrayBlockingQueue的出队

9k=

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

1.出队流程

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

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

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

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

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

2.出队方法

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

poll 方法//获取元素,如果队列没有元素直接返回null

public E poll() {

//上锁

final ReentrantLock lock = this.lock;

lock.lock();

try {

//如果队列有元素,调用dequeue获取元素,否则返回null

return (count == 0) ? null : dequeue();

} finally {

//释放锁资源

lock.unlock();

}

}

//获取元素,如果队列没有元素,有超时时间的等待队列有元素入队

public E poll(long timeout, TimeUnit unit) throws InterruptedException {

//计算超时时间

long nanos = unit.toNanos(timeout);

//上锁

final ReentrantLock lock = this.lock;

lock.lockInterruptibly();

try {

while (count == 0) {

if (nanos <= 0)

//超时返回null

return null;

//带超时时间的条件等待

nanos = notEmpty.awaitNanos(nanos);

}

//未超时并且队列有元素,调用dequeue方法获取元素

return dequeue();

} finally {

//释放锁资源

lock.unlock();

}

}

take 方法//获取元素,如果队列没有元素,一直等待队列有元素入队

public E take() throws InterruptedException {

//上锁

final ReentrantLock lock = this.lock;

lock.lockInterruptibly();

try {

while (count == 0)

//while循环,如果队列没有元素,一直带条件等待

notEmpty.await();

//调用dequeue方法获取元素

return dequeue();

} finally {

//释放锁资源

lock.unlock();

}

}

以上就是java中ArrayBlockingQueue的出队方法,在学会了出队的流程后就可以进行实例操作。这里我们也需要对不同的函数方法有所了解,然后结合ArrayBlockingQueue的用法一起实现出队。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值