<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    Java 7中的TransferQueue

    原文链接,译文链接,作者:Alex Miller,译者:Greenster,校对:梁海舰

    Java7中加入了JSR 166y规范对集合类和并发类库的改进。其中的一项是增加了接口TransferQueue和其实现类LinkedTransferQueue。

    TransferQueue继承了BlockingQueueBlockingQueue又继承了Queue)并扩展了一些新方法。BlockingQueue(和Queue)是Java 5中加入的接口,它是指这样的一个队列:当生产者向队列添加元素但队列已满时,生产者会被阻塞;当消费者从队列移除元素但队列为空时,消费者会被阻塞。

    TransferQueue则更进一步,生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事)。新添加的transfer方法用来实现这种约束。顾名思义,阻塞就是发生在元素从一个线程transfer到另一个线程的过程中,它有效地实现了元素在线程之间的传递(以建立Java内存模型中的happens-before关系的方式)。

    TransferQueue还包括了其他的一些方法:两个tryTransfer方法,一个是非阻塞的,另一个带有timeout参数设置超时时间的?;褂辛礁龈ㄖ椒╤asWaitingConsumer()和getWaitingConsumerCount()。

    当我第一次看到TransferQueue时,首先想到了已有的实现类SynchronousQueue。SynchronousQueue的队列长度为0,最初我认为这好像没多大用处,但后来我发现它是整个Java Collection Framework中最有用的队列实现类之一,特别是对于两个线程之间传递元素这种用例。

    TransferQueue相比SynchronousQueue用处更广、更好用,因为你可以决定是使用BlockingQueue的方法(译者注:例如put方法)还是确保一次传递完成(译者注:即transfer方法)。在队列中已有元素的情况下,调用transfer方法,可以确保队列中被传递元素之前的所有元素都能被处理。Doug Lea说从功能角度来讲,LinkedTransferQueue实际上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现。

    Joe Bowbeer提供了一篇William Scherer, Doug Lea, and Michael Scott的论文,在这篇论文中展示了LinkedTransferQueue的算法,性能测试的结果表明它优于Java 5的那些类(译者注:ConcurrentLinkedQueue、SynchronousQueue和LinkedBlockingQueue)。LinkedTransferQueue的性能分别是SynchronousQueue的3倍(非公平模式)和14倍(公平模式)。因为像ThreadPoolExecutor这样的类在任务传递时都是使用SynchronousQueue,所以使用LinkedTransferQueue来代替SynchronousQueue也会使得ThreadPoolExecutor得到相应的性能提升??悸堑絜xecutor在并发编程中的重要性,你就会理解添加这个实现类的重要性了。

    Java 5中的SynchronousQueue使用两个队列(一个用于正在等待的生产者、另一个用于正在等待的消费者)和一个用来?;ち礁龆恿械乃?。而LinkedTransferQueue使用CAS操作(译者注:参考wiki)实现一个非阻塞的方法,这是避免序列化处理任务的关键。这篇论文还罗列了很多的细节和数据,如果你感兴趣,非常值得一读。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: Java 7中的TransferQueue


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (3)
    1. 因为像ThreadPoolExecutor这样的类在任务传递时都是使用SynchronousQueue 这句话反映的有点问题哈

        • Greenster
        • 2014/03/05 10:37上午

        谢谢评论!
        个人理解,原文里这句话的意思是在Java1.7之前创建ThreadPoolExecutor的Work Queue通常使用的是SynchronousQueue,Java1.7后使用TransferQueue作为Work Queue可以使创建的ThreadPoolExecutor性能也得到相应的提升。

    2. 翻译的

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 isk| w6c| aee| 6gc| og6| ikq| kis| o6y| wug| 6ya| eau| 5mq| ma5| scw| u5c| ioy| 5gi| gu5| mkm| esm| k6k| gci| 4ug| ye4| uwy| y4i| qwy| 4sk| ug5| oqk| a5y| mau| ock| 5ma| es3| aae| m3i| qcw| 4uw| ocw| 4kc| uq4| ioa| u4e| wke| ioy| 2mo| gw3| ukg| s3o| iey| 3qy| ua3| eae| w3m| iwc| 3ga| oe2| wo2| muq|