2011-12-21 10 views

答えて

39

SynchronousQueueはより多くのハンドオフですが、LinkedBlockingQueueは単一の要素を許可します。違いは、SynchronousQueue へのput()呼び出しは対応するtake()コールがあるが、LinkedBlockingQueueのサイズが1になるまでを返さず、put()コール(空のキューへの呼び出し)はすぐに戻ります。

自分でSynchronousQueueを直接使用したことはありませんが、Executors.newCachedThreadPool()メソッドで使用されるデフォルトのBlockingQueueです。 が実際にになっていないときのための基本的なBlockingQueueの実装です(保留中のデータを保持したくない)。

+0

主な考え方は、resultが準備完了になるまでスレッドの読み取りをブロックし、読み取りスレッドが読み込み可能になるまでスレッド書き込みをブロックすることです。 – Anton

+8

@Umar複数のスレッドが、消費者が消費し処理できるよりも速くキューのオブジェクトを生成すると、キューのサイズが大きくなりすぎる可能性があります。 SynchronousQueueは、プロデューサ内の特定のコードなしで通信を制御するのに役立ちます。実際の生活では、他人からの質問に1人が答えるというミーティングに似ています。秘書の一種としてSynchronousQueueを考えてみましょう。 – andrey

+0

私はSyncQをかなり使っていますが、それは良いハンドオフ抽象で、比較的良いimplです。 (これは、待機時の割り当てを持っています) – bestsss

9

上記のコードを理解する限り、同じことをします。

いいえ、コードはまったく同じではありません。

Sync.Q。ウェイターが成功するためのオファーを必要とします。 LBQはアイテムを保持し、ウェイターがいなくてもオファーはすぐに終了します。

SyncQはタスクのハンドオフに役立ちます。保留中のタスクと待ち行列で待機中の3つのスレッドがリストにあるとしたら、受け入れられない場合はoffer()をリストの1/4と試してください。スレッドはタスクを単独で実行できます。 [最後の1/4は現在のスレッドで処理する必要があります。なぜなら、1/4と1/3ではないと思うのですが]

作業者に作業を渡そうとすると思いますが、あなた自身でタスクを実行する(または例外を投げる)。逆にLBQでは、タスクをキューに残しても実行が保証されるわけではありません。

注:/消費者及び運営者W場合、すなわちブロックと消費者を待たなくoffer又はpoll戻った後、それはタスク/要素が処理される保証できる出版社、同じです。

6

SynchronousQueueを使用する理由の1つは、アプリケーションのパフォーマンスを向上させることです。スレッド間にハンドオフが必要な場合は、同期オブジェクトが必要です。その使用に必要な条件を満たすことができれば、SynchronousQueueは私が見つけた最も速い同期オブジェクトです。他の人は同意する。参照:Implementation of BlockingQueue: What are the differences between SynchronousQueue and LinkedBlockingQueue

0

SynchronousQueueは、以下の主な相違点と同様の方法で動作します: 1)SynchronousQueueのサイズは0 2である)に置く()テイク()メソッドがあること取り出すことができるようになります場合、このメソッドは唯一の要素を挿入します同じ瞬間の待ち行列からの要素、つまり、消費者がtake()呼び出しでそれを消費するのに時間がかかる場合、要素を挿入することはできません。

SynchronousQueue - 誰かがその瞬間にそれを受け取ったときにのみ挿入します。

関連する問題