队列有长度限制,当队列中满了,往队列中放元素的动作会被阻塞,当队列是空的时候,往队列中拿元素,这个拿的动作会被阻塞。
在Java中,阻塞队列都是实现了BlockingQueue接口。
在BlockingQueue中,入队和出队的几个方法,这些方法都是成对出现的:
add()和remove():这两个方法是非阻塞的,当队列满的时候,add会抛出异常,当队列空的时候,remove会抛出异常。
offer()和poll():使用offer往满的队列里放元素,会返回false;poll方法从空的队列里拿元素,会返回null。
put()和take():这是阻塞的方法。使用put往满的队列里放元素,会被阻塞;使用take往空的队列里拿元素,会被阻塞。
常见的阻塞队列:
ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
无界队列,在插入的时候并不会阻塞,但是在拿取的时候会阻塞。而有界队列,在插入和拿取的时候都会阻塞。
网友评论