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
延迟队列