1、ConcurrentLinkedQueue类:
(1)基于链表的无界线程安全队列。此队列对元素FIFO(先进先出)进行排序。队列的头部是队列中最长时间的元素。队列的尾部是队列中最短时间的元素。新元素插入队列的尾部,队列检索操作获取队列头部的元素。(若需要使用基于链表的无界线程安全双端队列,可考虑ConcurrentLinkedDeque )
(2)几个常用方法:
①add方法,将指定元素插入此队列的尾部。由于队列是无限制的,因此该方法永远不会抛出 IllegalStateException或返回false。
public boolean add(E e)
②offer方法:将指定元素插入此队列的尾部。由于队列是无限制的,因此该方法永远不会返回false。
public boolean offer(E e)
③poll方法:检索并删除此队列的头部,或者null如果此队列为空则返回。
public E poll()
④peek方法:检索但不移除此队列的头部,或者null如果此队列为空则返回。
public E peek()
add方法与offer方法一样,但需注意poll方法和peek方法的区别,poll会删除队列头部元素,而peek方法不会。
2、LinkedBlockingQueue类:
(1)两个较为常用的构造函数:
//创建一个LinkedBlockingQueue容量为 Integer.MAX_VALUE。
public LinkedBlockingQueue()
//创建LinkedBlockingQueue具有给定(固定)容量的capacity。
public LinkedBlockingQueue(int capacity)
(2)常用方法介绍:
①put方法:将指定的元素插入此队列的尾部,若空间已满,阻塞等待至空间变为可用。
public void put(E e) throws InterruptedException
②offer方法:如果可以在不超出队列容量的情况下立即执行此操作,则将指定元素插入此队列的尾部,true成功返回并且false此队列已满。(也可以设置等待一段时长,若超过时长,则自动放弃)
public boolean offer(E e)
//timeout在放弃之前等待多长时间
public boolean offer(E e,long timeout,TimeUnit unit) throws InterruptedException
③take方法:检索并删除此队列的头部,必要时等待,直到元素可用。
public E take() throws InterruptedException
④获取并删除此队列的头部,或者如果此队列为空则返回null。(也可指定等待一定的时长后在放弃)
public E poll()
public E poll(long timeout,TimeUnit unit) throws InterruptedException
⑤peek方法:获取但不移除此队列的头部,或者如果此队列为空则返回null。
public E peek()
3、ArrayBlockingQueue类:
(1)由数组支持的有界阻塞队列。此队列对元素FIFO(先进先出)进行排序。队列的 头部是队列中最长时间的元素。队列的尾部是队列中最短时间的元素。新元素插入队列的尾部,队列检索(retrieval )操作获取队列头部的元素。此类支持用于排序等待生产者和消费者线程的可选公平策略。默认情况下,不保证此顺序。但是,使用公平性构造的队列true以FIFO顺序授予线程访问权限。公平性通常会降低吞吐量,但会降低可变性并避免饥饿。
//创建一个ArrayBlockingQueue具有给定(固定)容量和默认访问策略(非公平)。
ArrayBlockingQueue(int capacity)
//创建ArrayBlockingQueue具有给定(固定)容量和指定的访问策略。
ArrayBlockingQueue(int capacity, boolean fair)
(2)常用方法介绍:
①add方法:在不超出队列容量的情况下立即执行此操作,则将指定元素插入此队列的尾部,成功返回true,如果此队列已满抛出IllegalStateException。
public boolean add(E e)
②offer方法:类似于add方法,但失败时不会抛出异常,会返回false。
//如果可以在不超出队列容量的情况下立即执行此操作,则将指定元素插入此队列的尾部,成功返回true,此队列已满返回false。
public boolean offer(E e)
//将指定的元素插入此队列的尾部,等待指定的等待时间,如果成功返回true,或者在空间可用之前经过了指定的等待时间返回false。
public boolean offer(E e,long timeout,TimeUnit unit) throws InterruptedException
③put方法:将指定的元素插入此队列的尾部,队列已满时阻塞至队列空间可用。
public void put(E e)
④poll方法:检索并删除此队列的头部,或者如果此队列为空则返回null。
public E poll()
public E poll(long timeout,TimeUnit unit) throws InterruptedException
⑤take方法:检索并删除此队列的头部,必要时等待,直到元素可用。
public E take() throws InterruptedException
⑥peek方法:检索但不移除此队列的头部,如果此队列为空则返回null。
public E peek()
4、DelayQueue类:
//需注意对泛型元素的限制 E extends Delayed,元素需要实现(implements)Delayed接口
//用来指定延迟时间,及重写(Override)compareTo方法。
Class DelayQueue<E extends Delayed>
(1)Delayed元素的一种无界阻塞队列,其中一个元素只有在其延迟到期时才能被使用。 队列的头部是延迟到期的Delayed元素。
(2)常用方法介绍:
①add方法:将指定的元素插入此延迟队列。
boolean add(E e)
②offer方法:将指定的元素插入此延迟队列。
boolean offer(E e)
③put方法:将指定的元素插入此延迟队列。由于队列是无限制的,因此该方法永远不会阻塞。
public void put(E e)
④take方法:检索并删除此队列的头部,必要时等待,直到此队列上有一个具有过期延迟的元素。
public E take() throws InterruptedException
⑤poll方法:检索并删除此队列的头部,或者null 如果此队列没有具有过期延迟的元素,则返回该队列。
public E poll()
public E poll(long timeout,TimeUnit unit) throws InterruptedException
⑥peek方法:检索但不移除此队列的头部,或者如果此队列为空则返回null。与poll不同 ,如果队列中没有可用的过期元素,则此方法将返回下一个将过期的元素(如果存在)。
public E peek()
5、LinkedTransferQueue类:
(1)基于链表的的无界TransferQueue。该队列针对任何给定的生产者对元素FIFO(先进先出)进行排序。队列的头部是队列中某个生产者最长时间的元素。队列的尾部是队列中对于某些生产者来说是最短的时间的元素。
(2)常用方法介绍:
①add方法:将指定元素插入此队列的尾部。
//由于队列是无限制的,因此该方法永远不会抛出 IllegalStateException或返回false。
public boolean add(E e)
②offer方法:将指定元素插入此队列的尾部。
//由于队列是无限制的,因此该方法永远不会返回false。
public boolean offer(E e)
public boolean offer(E e,long timeout,TimeUnit unit)
③put方法:将指定元素插入此队列的尾部。由于队列是无限制的,因此该方法永远不会阻塞。
public void put(E e)
④peek方法:获取但不移除此队列的头部,或者如果此队列为空则返回null。
public E peek()
⑤poll方法:检索并删除此队列的头部,或者如果此队列为空则返回null。
public E poll()
public E poll(long timeout,TimeUnit unit) throws InterruptedException
⑥take方法:检索并删除此队列的头部,必要时等待,直到元素可用。
public E take() throws InterruptedException
⑦transfer方法:将元素传输给消费者,必要时等待。更确切地说,如果存在已经等待接收它的消费者(在take()或定时poll),则立即传送指定的元素 ,否则在该队列的尾部插入指定的元素并等待消费者接收该元素。
public void transfer(E e) throws InterruptedException
public boolean tryTransfer(E e,long timeout,TimeUnit unit) throws InterruptedException
6、SynchronousQueue 类:
(1)一个阻塞队列,其中每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。同步队列没有任何内部容量,甚至没有容量。您不能 peek在同步队列中,因为只有在您尝试删除元素时才会出现该元素; 你不能插入一个元素(使用任何方法),除非另一个线程试图删除它; 你不能迭代,因为没有什么可以迭代。
//使用不公平的访问策略创建SynchronousQueue。
SynchronousQueue()
//使用指定的公平策略创建SynchronousQueue。
SynchronousQueue(boolean fair)
(2)常用方法介绍:
①offer方法:如果另一个线程正在等待接收它,则将指定的元素插入此队列, 并返回true,否则返回false
public boolean offer(E e)
public boolean offer(E e,long timeout,TimeUnit unit) throws InterruptedException
②put方法:将指定的元素添加到此队列,等待另一个线程接收它。
public void put(E e) throws InterruptedException
③take方法:检索并删除此队列的头部,等待另一个线程插入它。
public E take() throws InterruptedException
④poll方法:如果另一个线程当前正在使元素可用,则检索并移除此队列的头部
public E poll()
public E poll(long timeout,TimeUnit unit) throws InterruptedException
⑤peek方法:总是返回null。一个SynchronousQueue除非主动等待否则不返回元素。
public E peek()