面试题答案
一键面试初始化方式
通过new ArrayBlockingQueue(capacity)
或new ArrayBlockingQueue(capacity, fair)
来初始化。其中capacity
指定队列容量,fair
为布尔值,若为true
表示公平队列,即按照FIFO原则处理等待的线程;若为false
(默认)表示非公平队列。
容量限制
ArrayBlockingQueue是有界队列,在初始化时就确定了固定容量。队列的容量决定了能够容纳任务的最大数量,一旦达到该容量,往队列中添加新任务可能会阻塞(取决于使用的添加方法)。
任务存取特性
- 插入操作:
add(E e)
:如果队列未满,将元素添加到队列尾部并返回true
;如果队列已满,则抛出IllegalStateException
。offer(E e)
:如果队列未满,将元素添加到队列尾部并返回true
;如果队列已满,返回false
,不会阻塞。offer(E e, long timeout, TimeUnit unit)
:在指定的等待时间内,如果队列有空间,将元素添加到队列尾部并返回true
;如果等待时间结束队列仍无空间,则返回false
。put(E e)
:如果队列已满,会阻塞当前线程,直到队列有空间,然后将元素添加到队列尾部。
- 移除操作:
remove(Object o)
:移除队列中指定的元素,如果移除成功返回true
,否则返回false
。poll()
:移除并返回队列头部元素,如果队列为空则返回null
。poll(long timeout, TimeUnit unit)
:在指定的等待时间内,如果队列不为空,移除并返回队列头部元素;如果等待时间结束队列仍为空,则返回null
。take()
:如果队列为空,会阻塞当前线程,直到队列中有元素,然后移除并返回队列头部元素。
- 查看操作:
element()
:返回队列头部元素,但不移除,如果队列为空则抛出NoSuchElementException
。peek()
:返回队列头部元素,但不移除,如果队列为空则返回null
。