Java 7 LinkedTransferQueue解析

Java 7 LinkedTransferQueue解析

LinkedTransferQueue出身Google,现在已经被集成在JDK7中,但目前主流的JDK平台仍然是JDK6,所以很多时候我们需要这样引入:

import com.google.code.yanf4j.util;

她的作者依然是Doug Lea大神,他说:

LinkedTransferQueue是一个聪明的队列,他是ConcurrentLinkedQueue,
SynchronousQueue (in “fair” mode公平模式), and unbounded LinkedBlockingQueue的超集。

我们从她的声明中也可以看出这一点:

public class LinkedTransferQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>

Google的注释中,有这样一段描述:

This class extends the approach used in FIFO-mode SynchronousQueues. See the internal documentation, as well as the PPoPP 2006 paper “Scalable Synchronous Queues” by Scherer,
Lea & Scott

(http://www.cs.rice.edu/~wns1/papers/2006-PPoPP-SQ.pdf)

The main extension is to provide different Wait modes for the main “xfer” method that puts or takes items. These don’t impact the basic dual-queue logic, but instead control whether or how threads block upon insertion of request or data nodes into the dual queue. It also uses slightly different conventions for tracking whether nodes are off-list or cancelled.

LinkedTransferQueue实现了一个重要的接口TransferQueue,该接口含有下面几个重要方法:

1. transfer(E e)

若当前存在一个正在等待获取的消费者线程,即立刻移交之;否则,会插入当前元素e到队列尾部,并且等待进入阻塞状态,到有消费者线程取走该元素。

2. tryTransfer(E e)

若当前存在一个正在等待获取的消费者线程(使用take()或者poll()函数),使用该方法会即刻转移/传输对象元素e;若不存在,则返回false,并且不进入队列。这是一个不阻塞的操作。

3. tryTransfer(E e, long timeout, TimeUnit unit)

若当前存在一个正在等待获取的消费者线程,会立即传输给它; 否则将插入元素e到队列尾部,并且等待被消费者线程获取消费掉,若在指定的时间内元素e无法被消费者线程获取,则返回false,同时该元素被移除。

4. hasWaitingConsumer()

判断是否存在消费者线程

5. getWaitingConsumerCount()

获取所有等待获取元素的消费线程数量

6. size()

因为队列的异步特性,检测当前队列的元素个数需要逐一迭代,可能会得到一个不太准确的结果,尤其是在遍历时有可能队列发生更改。

7. 批量操作

类似于 addAll,removeAll, retainAll, containsAll, equals, toArray 等方法,API不能保证一定会立刻执行。