java - BlockingQueue 和 TransferQueue 的区别

标签 java concurrency jsr166

对于 BlockingQueue/LinkedBlockingQueue 与来自 jsr166y 和 java 7 的新 TransferQueue/LinkedTransferQueue 类型之间的区别我有点困惑

最佳答案

来自 TransferQueue JavaDocs :

A BlockingQueue in which producers may wait for consumers to receive elements. A TransferQueue may be useful for example in message passing applications in which producers sometimes (using method transfer(E)) await receipt of elements by consumers invoking take or poll, while at other times enqueue elements (via method put) without waiting for receipt.

换句话说,当你使用 BlockingQueue 时,你只能将元素放入队列(如果队列已满则阻塞)。使用 TransferQueue,您还可以阻塞直到其他线程收到您的元素(您必须为此使用新的 transfer 方法)。这就是区别。使用 BlockingQueue,您不能等到其他线程删除您的元素(仅当您使用 SynchronousQueue 时,但这并不是真正的队列)。

除此之外,TransferQueue 也是一个 BlockingQueue。查看 TransferQueue 中新的可用方法:http://download.oracle.com/javase/7/docs/api/java/util/concurrent/TransferQueue.html (transfer, tryTransfer, hasWaitingConsumer, getWaitingConsumerCount)。


Collections Framework Enhancements in Java SE 7明确地说:

The interface TransferQueue has been added. It is a refinement of the BlockingQueue interface in which producers can wait for consumers to receive elements. One implementation of the new interface is also included in this release, LinkedTransferQueue.

关于java - BlockingQueue 和 TransferQueue 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7317579/

相关文章:

java - 并发线程和共享对象死锁

rest - 测试对基于 REST 的 Web 服务器的并发请求

java - 如何将文件正确添加到 Maven 中的引导类路径?

java - AtomicReferenceFieldUpdater - 方法 set、get、compareAndSet 语义

java - Maven 错误 : Could not find or load main class org. codehaus.plexus.classworlds.launcher.Launcher

java - 如何在 Java 中定义运算符对类的作用

java - 使用 ESP Scheduler 进行 Spring 批量调度

java - 从文件读取返回 null

java - 您是否应该在使用 ConcurrentMap 的 putIfAbsent 之前检查 map 是否包含 key