阻塞队列和转移队列之间的区别

2022-08-31 16:42:18

我对BlocklingQueue/LinkedBlockingQueue和jsr166y和java 7中新的TransferQueue/LinkedTransferQueue类型之间的区别有点困惑。


答案 1

From TransferQueue JavaDocs

一个阻塞队列,生产者可以在其中等待使用者接收元素。例如,在消息传递应用程序中,传输队列可能很有用,在这些应用程序中,生产者有时(使用方法 transfer(E))等待调用 take 或 poll 的消费者接收元素,而在其他时候,将元素排入队列(通过方法 put)而不等待接收。

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

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


Java SE 7 中的集合框架增强功能明确指出:

接口传输队列已添加。它是 BlockingQueue 接口的改进,在该接口中,生产者可以等待使用者接收元素。新接口的一个实现也包含在此版本中,即LinkedTransferQueue。


答案 2

简而言之,BlockingQueue保证生产者制作的元素必须在队列中,而TransferQueue更进一步,它保证元素被某些消费者“消耗”。


推荐