阻塞队列与普通队列的区别
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.
阻塞队列:BlockingQueue
阻塞队列是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和溢出方法。
支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的过程,直到队列不满。
支持阻塞的移除方法:当队列空时,获取元素的线程会等待队列变为非空。
常用于生产者-消费者场景。
公共接口BlockingQueue <E> JDK提供的7个阻塞队列:
ArrayBlockingQueue(数组结构组成的有界阻塞队列)
LinkedBlockingQueue(链表结构组成的有界阻塞队列)
PriorityBlockingQueue(支持优先级排序的无界阻塞队列)
DelayQueue(使用优先级队列实现的无界阻塞队列)
SynchronousQueue(不存储元素的的阻塞队列)
LinkedTransferQueue(链表结构组成的无界阻塞队列)
LinkedBlockingDeque(链表结构组成的双向阻塞队列)
并发队列(高性能队列)
ConcurrentLinkedQueue:线程安全的无界队列。底层采用单链表。支持 FIFO。
ConcurrentLikedDeque:线程安全的无界双端队列。底层采用双向链表。支持 FIFO 和 FILO。