58

BlockingQueue/LinkedBlockingQueue と、jsr166y および Java 7 の新しい TransferQueue/LinkedTransferQueue タイプの違いについて、少し混乱しています。

4

4 に答える 4

79

TransferQueue JavaDocsから:

プロデューサがコンシューマが要素を受け取るのを待つことができる BlockingQueue。TransferQueue は、たとえばメッセージ パッシング アプリケーションで役立つ場合があります。このようなアプリケーションでは、プロデューサが (メソッド transfer(E) を使用して) take または poll を呼び出すコンシューマによる要素の受信を待機することもあれば、受信を待たずに (メソッド put を介して) 要素をキューに入れることもあります。

つまり、BlockingQueue を使用すると、要素をキューに入れることしかできません (キューがいっぱいの場合はブロックします)。TransferQueue を使用すると、他のスレッドが要素を受け取るまでブロックすることもできます (そのためには newtransferメソッドを使用する必要があります)。これが違いです。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は、明示的に次のように述べています。

インターフェイス TransferQueue が追加されました。これは、プロデューサーがコンシューマーが要素を受け取るのを待つことができる BlockingQueue インターフェースの改良版です。このリリースには、新しいインターフェースの 1 つの実装である LinkedTransferQueue も含まれています。

于 2011-09-06T09:24:07.603 に答える
7

つまり、BlockingQueue はプロデューサーによって作成された要素がキューにある必要があることを保証しますが、TransferQueue はさらに一歩進んで、要素が一部のコンシューマーによって「消費される」ことを保証します。

于 2014-02-10T04:11:45.410 に答える
-2

何らかの形のパフォーマンスの違いがあるように見えますが; ArrayBlockingQueue と LinkedTransferQueue およびその仲間を参照してください

于 2013-11-04T17:24:36.067 に答える