阻塞队列(BlockingQueue)是支持两个附加操作的队列,这两个操作支持阻塞的插入和移除方法。
1)支持阻塞的插入方法,当队列满时,队列会阻塞插入元素的线程,直到队列不满。
2)支持阻塞的移除方式,当队列为空时,获取元素的线程会等待直到队列不为空。
几种插入、移除方法比较:
插入方法:
1)add(e):将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,如果此队列已满,则抛出 IllegalStateException。
2)offer(e):将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,如果此队列已满,则返回 false。此方法通常要优于add(e) 方法,后者可能无法插入元素,而只是抛出一个异常。
3)put(e):将指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间。
4)offer(e,timeout,unit):将指定的元素插入此队列的尾部,如果该队列已满,则在到达指定的等待时间之前等待可用的空间。
移除方法:
1)remove(e):从此队列中移除指定元素的单个实例(如果存在)。
2)poll():获取并移除此队列的头,如果此队列为空,则返回 null。
3)take():获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。
Java中的阻塞队列
JDK 7里提供了7个阻塞队列,如下:
1)ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
2)LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
3)PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
4)DelayQueue:一个使用优先级队列实现的无界阻塞队列,支持延时获取元素,只有在延迟期满时才能从队列中提取元素。
5)SynchronousQueue:一个不储存元素的阻塞队列,每一个put操作必须等待一个take操作。
6)LinkedTransferQueue:一个链表结构组成的无界阻塞队列,可以让put()线程阻塞,直到有take()线程取走该元素。
7)LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。