Java并发——阻塞队列

1.阻塞队列:

对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化。使用队列可以安全地从一个线程向另一个线程传递数据。例如,银行转账程序,转账线程将转账指令对象插入一个队列中,而不是直接访问银行对象。另一个线程从队列中取出指令执行转账。只有该线程可以访问该银行对象的内部。因此就不需要同步了。

当试图向队列添加元素而队列已满,或是想从队列中移出元素而队列为空时,阻塞队列导致线程阻塞。工作者线程可以周期性地将中间结果存储到阻塞队列中。其他的工作者线程移出中间结果并进一步加以修改。队列会自动的平衡负载。在相邻的线程存在快慢的情况下会进行平衡。

阻塞队列方法:

方法

正常动作

特殊情况

add

添加元素

如果队列满,抛出IllegalStateException

element

返回队列的头元素

如果空,抛出NoSuchElementException

offer

添加一个元素并返回true

如果满,返回false

peek

返回队列的头元素

如果空,返回null

poll

移出并返回队列的头元素

如果空,返回null

put

添加一个元素

如果满,则阻塞

remove

移出并返回头元素

如果空,抛出NoSuchElementException

take

移出并返回头元素

如果空,则阻塞

java.util.concurrent包提供了阻塞队列的几个变种。

LinkedBlockingQueue在默认情况下的容量是没有上限的,但是,也可以指定容量。LinkedBlockingQueue是双端的版本。

ArrayBlockingQueue在构造时需要指定容量,并且需要一个可选的参数来指定是否需要公平性。如果设置了公平参数,那么等待了最长时间的线程会优先得到处理,但是这样会降低性能。

PriorityBlockingQueue是一个带有优先级的队列,该队列没有上限,但是在空队列时取元素则会阻塞。

DelayQueue包含实现Delayed接口的对象,getDelay方法返回对象的残留延迟。负值表示延迟结束。元素只有在延迟用完的情况下才能从DelayQueue移除。还必须实现compareTo方法用于排序。

Java SE 7增加了一个TransferQueue接口,允许生产者线程等待,直到消费者线程准备好。LinkedTransferQueue类实现了这个接口。

2.java.util.concurrent.ArrayBlockingQueue<E> 5.0:

ArrayBlockingQueue(int capacity)

ArrayBlockingQueue(int capavity, boolean fair)

构造一个带有指定的容量和公平性设置的阻塞队列。该队列用循环数组实现。

3.java.util.concurrent.LinkedBlockingQueue<E>/java.util.concurrent.LinkedBlockingDeque<E> 5.0:

LinkedBlockingQueue()

LinkedBlockingDeque()

构造一个无上限的阻塞队列或双向队列,用链表实现。

LinkedBlockingQueue(int capacity)

LinkedBlockingDeque(int capacity)

根据指定容量构造。。。

4.java.util.concurrent.DelayQueue<E extends Delayed> 5.0:

DelayQueue()

构造一个包含Delayed元素的无界的阻塞时间有限的阻塞队列。只有那些延迟已经超过时间的元素可以从队列中移出。

5.java.util.concurrent.Delayed 5.0:

long getDelay(TimeUnit unit)

得到该对象的延迟,用给定的时间单位进行度量。

6.java.util.concurrent.PriorityBlockingQueue<E> 5.0:

PriorityBlockingQueue()

PriorityBlockingQueue(int initialCapacity)

PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator)

构造一个无边界阻塞优先队列,用堆实现。

7.java.util.concurrent.BlockingQueue<E> 5.0:

void put(E element)

添加元素。

E take()

移除并返回头元素,必要时阻塞。

boolean offer(E element, long  time, TimeUnit unit)

添加给定元素,如果成功返回true,如果必要时阻塞,直至元素已经被添加或超时。

E poll(long time, TimeUnit unit)

移除并返回头元素,必要时阻塞,直至元素可用或超时用完。失败返回null。

8.java.util.concurrent.BlockingDeque<E> 6:

void putFirst(E element)

void putLast(E element)

添加元素,必要时阻塞。

E takeFirst()

E takeLast()

移除并返回头元素或尾元素,必要时阻塞。

boolean offerFirst(E element, long time, TimeUnit unit)

boolean offerLast(E element, long time, TimeUnit unit)

添加给定的元素,成功时返回true,必要时阻塞直至元素被添加或超时。

E pollFirst(long time, TimeUnit unit)

E pollLast(long time, TimeUnit unit)

移动并返回头元素或尾元素,必要时阻塞,直至元素可用或超时。失败时返回null。

9.java.util.concurrent.TransferQueue<E> 7:

void transfer(E element)

boolean tryTransfer(E element, long time, TimeUnit unit)

传输一个值,或者尝试在给定的超时时间内传输这个值,这个调用将阻塞,直到另一个线程将元素删除。第二个方法会在调用成功时返回true。

猜你喜欢

转载自blog.csdn.net/qq_38386085/article/details/84035841