阻塞队列
方法 | 表现 | |
---|---|---|
添加元素: | ||
boolean add(E e); | 成功返回true。 如果队列已满, 抛异常 IllegalStateException。 |
|
boolean offer(E e); | 成功返回true。 失败返回false。 如果队列已满, 直接返回false 。 |
|
void put(E e) throws InterruptedException; | 如果队列已满,等待空间可用 。 |
|
boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException; |
成功返回true。 失败返回false。 如果队列已满, 等待timeout时间 返回结果。 |
|
移出队头 | ||
E remove(); | 移除队列头部并将其返回。 如果队列为空, 抛异常 NoSuchElementException。 |
|
E poll(); | 移除队列头部并将其返回。 如果队列为空, 返回null 。 |
|
E take() throws InterruptedException; | 移除队列头部并将其返回。 如果队列为空, 等待直到有元素 可移出 |
|
E poll(long timeout, TimeUnit unit) throws InterruptedException; | 移除队列头部并将其返回。 如果队列为空, 等待timeout时间 返回结果。 |
|
取队头 | ||
E element(); | 不移除队头,仅获取其值。 如果队列为空, 抛异常 NoSuchElementException。 |
|
E peek(); | 不移除队头,仅获取其值。 如果队列为空, 返回null 。 |
方法\处理方式 | 抛出异常 | 返回特殊值 | 一直阻塞 | 超时退出 |
---|---|---|---|---|
添加元素 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
移出队头 | remove() | poll() | take() | poll(time,unit) |
取队头 | element() | peek() | 不可用 | 不可用 |
ArrayBlockingQueue
一个用循环数组实现的有界阻塞队列。必须指定队列长度,按 FIFO(先进先出)原则对元素进行排序
LinkedBlockingQueue
一个用链表实现的有界阻塞队列。可不指定队列长度,默认为Integer.MAX_VALUE
,按FIFO (先进先出) 排序元素
吞吐量通常要高于 ArrayBlockingQueue
Executors.newFixedThreadPool() 使用了这个队列
SynchronousQueue
不存储元素的阻塞队列
每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态
吞吐量通常要高于 LinkedBlockingQueue
Executors.newCachedThreadPool使用了这个队列
PriorityBlockingQueue
具有优先级的、无限阻塞队列
网友评论