美文网首页
BlockQueue

BlockQueue

作者: whynotybb | 来源:发表于2019-07-05 16:26 被阅读0次

当队列为空时不能移除元素,当队列非空时通知线程,此时可以出队。

当队列已满时,不能插入元素,线程阻塞,当其他线程移除元素之后,通知线程可以插入了。

实现BlockQueue接口的类有:

ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue

ArrayBlockingQueue:底层利用数组实现的阻塞队列

从下图中可以看出,是利用Condition实现的,Condition内部维护一个等待队列。

维护了两个Condition对象

入队:将元素插入阻塞队列,并通知等待的线程队列非空,可以移除元素了。

ArrayBlockQueue的插入操作

出队:将元素从阻塞队列中移除,并通知等待插入元素的线程队列非满,可以插入元素了。

出队操作

上面的方法是将元素插入阻塞队列,可以看到是私有的,ArrayBlockingQueue对外提供的操作是put和offer:

put源码

这里可以看出,当队列已满时,会调用notFull.await()线程进入等待队列;等到调用完notFull.signal()才会继续执行下面的代码,也就是当队列非空时才执行插入操作。

LinkedBlockingQueue:底层用链表实现

可以看到这里使用两个锁来控制插入和移除。

相关文章

网友评论

      本文标题:BlockQueue

      本文链接:https://www.haomeiwen.com/subject/upkehctx.html