BlockingQueue/LinkedBlockingQueue と、jsr166y および Java 7 の新しい TransferQueue/LinkedTransferQueue タイプの違いについて、少し混乱しています。
4 に答える
プロデューサがコンシューマが要素を受け取るのを待つことができる 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 も含まれています。
つまり、BlockingQueue はプロデューサーによって作成された要素がキューにある必要があることを保証しますが、TransferQueue はさらに一歩進んで、要素が一部のコンシューマーによって「消費される」ことを保証します。
何らかの形のパフォーマンスの違いがあるように見えますが; ArrayBlockingQueue と LinkedTransferQueue およびその仲間を参照してください