BlockingQueue

blockingQueue

一Java接口,它代表了Java中线程安全的队列,不仅可以多线程地访问元素,还添加了等待-通知机制,

可以实现在阻塞等待取元素,阻塞等待插入元素

boolean add(E e) :将元素添加到队列尾部,如果队列满了,则抛出异常 IllegalStateException。

boolean offer(E e):将元素添加到队列尾部,如果队列满了,则返回 false。

void put(E e):将元素添加到队列尾部,如果队列满了,则线程将阻塞直到有空间。

offer(E e, long timeout, TimeUnit unit):将指定的元素插入此队列中,如果队列满了,则等待指定的时间,直到队列可用。

take():检索并删除此队列的头部,如有必要,则等待直到队列可用; 一般会上锁保证只有一个线程take到头部

poll(long timeout, TimeUnit unit):检索并删除此队列的头部,如果需要元素变得可用,则等待指定的等待时间。

boolean remove(Object o):从队列中删除元素,成功返回true,失败返回false

E poll():检索并删除此队列的头部,如果此队列为空,则返回null。

E element():检索但不删除此队列的头部,如果队列为空时则抛出 NoSuchElementException 异常;

peek():检索但不删除此队列的头部,如果此队列为空,则返回 null.

blockingDequeue

双端阻塞队列,继承于blockingQueue,可以想使用blockingQueue的API一样使用它

ArrayBlockingQueue

数组阻塞队列,有界的,且因为是基于静态数组实现的,一旦初始化,数组大小无法修改,且必须在构造时

初始化。

FIFO:队列操作符合先进先出

ArrayBlockingQueue并不能保证绝对的公平,即先到先得,因为还有线程调度的存在。想要保证绝对的公平

,可以在构造时置 fair=true

并发控制基于ReentrantLock和对应的Condition实现,读和写都得先获取锁。

LinkedBlockingQueue

基于链表实现的线程安全的阻塞队列

可实现头部和尾部的高效插入

可在构造时指定最大容量,若没指定,即为Integer.MAX_VALUE,即受限于内存大小,但还是有界的

LinkedBlockingQueue和ArrayBlockingQueue的区别

相同点:

都是通过从condition通知机制来实现可阻塞的插入和获取

不同点:

1.一个基于链表,一个基于数组

2.ArrayBlockingQueue读和写都是一把锁,而LinkedBlockingQueue读和写两把锁,锁的粒度更小

PriorityBlockingQueue

具有优先级特性的无界队列,元素在队列里面的排序基于自然的排序,或者我们实现Compare接口来实现自

定义排序,适用于根据优先级来执行任务

SynchronousQueue

LinkedTransferQueue

DelayQueue

延迟队列