`
san_yun
  • 浏览: 2638573 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

TransferQueue

 
阅读更多

在看netty的代码实现发现了TransferQueue,发现在jdk7已经加入。

 

在jdk7里的实现是LinkedTransferQueue。它实现了BlockingQueue的接口,并且提供了类似SynchronizeQueue的功能。由于采用了CAS的方式对线程进行同步,减少了锁的开销,性能相对与其他的队列实现有了很大的提升。其内部的实现是一个FiFo的Dual Quque。很多开源的项目,在jdk7之前,就早早的用上了这个东东,比如nettybonecpxmemcached

TransferQueue的基本使用和BlockingQueue差不多,有点特殊的就是它的transfer接口。

 

TransferQueue是一个继承了 BlockingQueue的接口,并且增加若干新的方法。LinkedTransferQueue是实现类,其定义为一个无界的队列,一样具有先进先出(FIFO : first-in-first-out)的特性。

Doug Lea 这样评价它:

TransferQueue是一个聪明的队列,它是ConcurrentLinkedQueue, SynchronousQueue (在公平模式下), 无界的LinkedBlockingQueues等的超集。
这里有一个有关LinkedTransferQueue的Doug Lea等人所撰写论文,讨论了其算法、性能等,地址:http://www.cs.rice.edu/~wns1/papers/2006-PPoPP-SQ.pdf
单纯从队列来看,TransferQueue接口增加了一些很实用的新特性,其transfer方法提供了线程之间直接交换对象的捷径,下面一一说来。
  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不能保证一定会立刻执行。
    因此,我们在使用过程中,不能有所期待,这是一个具有异步特性的队列。

或许,下次我们在构造一个线程池时,可以考虑使用TransferQueue:

public static ExecutorService newTransferCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new LinkedTransferQueue());
    }

 

注意事项:
  • 无论是transfer还是tryTransfer方法,在>=1个消费者线程等待获取元素时(此时队列为空),都会立刻转交,这属于线程之间的元素交换。注意,这时,元素并没有进入队列。
  • 在队列中已有数据情况下,transfer将需要等待前面数据被消费掉,直到传递的元素e被消费线程取走为止。
  • 使用transfer方法,工作者线程可能会被阻塞到生产的元素被消费掉为止
  • 消费者线程等待为零的情况下,各自的处理元素入队与否情况有所不同。
  • size()方法,需要迭代,可能不太准确,尽量不要调用。


或许,下次我们在构造一个线程池时,可以考虑使用TransferQueue:

 

参考:

jdk1.7 API http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TransferQueue.html

http://www.blogjava.net/yongboy/archive/2012/02/04/369575.html

分享到:
评论

相关推荐

    通过实例了解java TransferQueue

    `Java TransferQueue` 是 Java 并发库中的一种高级队列,它在 Java 7 中被引入,继承自 `BlockingQueue` 接口,并且添加了一些新的特性。`TransferQueue` 的主要特点是,生产者在将元素添加到队列中时会被阻塞,直到...

    Java7 新特征介绍(有插图)

    `LinkedTransferQueue`是一种高性能、无界队列实现,它使用链表结构存储元素,并且实现了`TransferQueue`接口,特别适用于高并发环境下数据传输的需求。 #### 五、客户端JRE能力增强 除了上述提到的新特性外,Java...

    聊聊并发(一)深入分析Volatile的实现原理

    本篇文章将深入分析Volatile的实现原理,结合`LinkedTransferQueue`和`TransferQueue`这两个与并发相关的Java源码,探讨其在多线程环境中的应用。 首先,我们需要理解Java内存模型(JMM,Java Memory Model),它是...

    Java7新特性中文介绍

    此外,`LinkedTransferQueue`类实现了`TransferQueue`接口,提供了一种高效且灵活的数据传输机制。 ##### 3.4 客户端JRE性能提升 针对Java富互联网应用程序(RIA)技术,Java 7中的客户端JRE软件进行了多项性能优化...

    西南交大数据结构实验课程设计报告:求工程的最短完成时间

    * queue<int> transferqueue:用来间接得到存放拓扑排序的逆排序栈 * stack<int> contrarytopostack:存放逆拓扑排序的栈 * int flag[maxsize]:用来标志一个顶点在拓扑排序中是否被访问 知识点4:活动与事件最早最...

    JDK7.0新特性

    1. **TransferQueue 接口**:新增了一个 `TransferQueue` 接口,这是 `BlockingQueue` 的一个增强版本,其主要实现类为 `LinkedTransferQueue`。`TransferQueue` 在处理阻塞队列时提供了更多的灵活性和控制能力。 #...

    google collection

    - **TransferQueue**:是一种特殊的队列实现,它可以将元素传递给等待的消费者线程。 - **应用场景**:在低线程池大小的情况下,优先使用等待中的线程而非创建新线程。 5. **排序算法改进**: - **TimSort**:...

    ftp应用工具

    ftp工具, ...<Item name="Last Server Port" type="numeric">21 <Item name="Last Server User" type="string">down <Item name="Last Server dont save pass" type="numeric">0 ...<TransferQueue/> </8uftp>

    JAVA7新特性介绍(官方公布)中文版[参照].pdf

    引入了`TransferQueue`接口,作为`BlockingQueue`的扩展,提供了非阻塞的元素传输能力。`LinkedTransferQueue`是其具体实现,提高了并发处理的效率。 7. **客户端JRE性能提升**: 针对Java Rich Internet ...

    java7帮助文档

    The TransferQueue interface has been added, which is a refinement of the BlockingQueue interface. The class LinkedTransferQueue implements the TransferQueue interface. Concurrency The fork/join ...

    java中线程队列BlockingQueue的用法

    `BlockingQueue`还提供了`TransferQueue`和`DelayQueue`两个子接口,分别用于支持异步传输和延迟生产元素的队列。 9. **性能优化** 使用`BlockingQueue`可以减少锁的使用,降低锁竞争,从而提高多线程环境下的...

    SynchronousQueue实现原理.pdf

    这通过内部的TransferQueue实现,它维护了head和tail指针来指向当前正在等待匹配的线程节点。在线程尝试put操作时,如果当前没有配对的take操作,该线程就会被加入队列并阻塞,直到有一个take操作线程出现来唤醒它。...

Global site tag (gtag.js) - Google Analytics