当队列为空时不能移除元素,当队列非空时通知线程,此时可以出队。
当队列已满时,不能插入元素,线程阻塞,当其他线程移除元素之后,通知线程可以插入了。
实现BlockQueue接口的类有:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue
ArrayBlockingQueue:底层利用数组实现的阻塞队列
从下图中可以看出,是利用Condition实现的,Condition内部维护一个等待队列。

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

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

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

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

LinkedBlockingQueue:底层用链表实现

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


网友评论