E
- このコレクション内に保持される要素の型public interface BlockingQueue<E> extends Queue<E>
Queue
です。
BlockingQueue メソッドには 4 つの形式があり、すぐには達成できなくても将来のある時点で達成できる可能性がある操作を異なる方法で処理します。1 つめは例外をスローし、2 つめは特殊な値 (操作に応じて null と false のいずれか) を返し、3 つめは操作が正常に完了するまで現在のスレッドを無期限にブロックし、4 つめは処理を中止するまで指定された制限時間内のみブロックします。これらのメソッドについて、次の表にまとめます。
例外のスロー | 特殊な値 | ブロック | タイムアウト | |
挿入 | add(e) |
offer(e) |
put(e) |
offer(e, time, unit) |
削除 | remove() |
poll() |
take() |
poll(time, unit) |
検査 | element() |
peek() |
適用外 | 適用外 |
BlockingQueue は null 要素を受け入れません。null の add、put、または offer が試みられると、実装によって NullPointerException がスローされます。null は、poll オペレーションが失敗したことを示す標識値として使用されます。
BlockingQueue は、容量が制限される場合があります。その場合は remainingCapacity を持ち、これを超過すると、追加要素の put はブロックされます。組み込み容量制限なしで BlockingQueue を使用すると、Integer.MAX_VALUE の残りの容量が常に報告されます。
BlockingQueue の実装は、主にプロデューサとコンシューマの間のキューで使用するように設計されていますが、加えて Collection
インタフェースもサポートします。そのため、たとえば、remove(x) を使用してキューから任意の要素を削除できます。ただし、このような操作は一般に実行の効率が悪いので、キュー内のメッセージの取り消しなど特定の用途がある場合にのみ実行されることを想定しています。
BlockingQueue 実装はスレッドセーフです。すべてのキューイングメソッドは、内部ロックまたは別の形式の並行処理制御を使用して効果を原子的に達成します。ただし、一括コレクション操作である addAll、containsAll、retainAll、および removeAll は、実装で特に指定されていないかぎり、必ずしも原子的には実行されません。そのため、たとえば、addAll(c) が c に要素の一部だけを追加したあとに (例外をスローして) 失敗する可能性があります。
BlockingQueue は本質的に、項目がこれ以上追加されないことを示すどのような種類の「クローズ」または「シャットダウン」操作もサポートしません。このような機能のニーズや使用は、実装に依存する傾向があります。たとえば、プロデューサが、コンシューマによって取得されたときに適宜解釈される特殊な end-of-stream または poison オブジェクトを挿入するという一般的な方法があります。
次に、プロデューサとコンシューマの通常のシナリオに基づく使用例を示します。BlockingQueue は、複数のプロデューサおよび複数のコンシューマで安全に使用できることに注意してください。
class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }
メモリー整合性効果: ほかの並行処理コレクションと同様、オブジェクトを BlockingQueue
に配置する前のスレッド内のアクションは、別のスレッドでのその要素へのアクセスまたは BlockingQueue
からの削除に続くアクションよりも前に発生します。
このインタフェースは、Java Collections Framework のメンバーです。
修飾子と型 | メソッドと説明 |
---|---|
boolean |
add(E e)
容量制限に違反することなく、指定された要素をこのキューにすぐに挿入できる場合はそうします。成功した場合は true を返し、その時点で使用可能な空き領域が存在しない場合は IllegalStateException をスローします。
|
boolean |
contains(Object o)
指定された要素がキューに含まれている場合に true を返します。
|
int |
drainTo(Collection<? super E> c)
このキューから利用可能なすべての要素を削除し、それらを指定されたコレクションに追加します。
|
int |
drainTo(Collection<? super E> c, int maxElements)
指定された数以内の利用可能な要素をこのキューから削除し、指定されたコレクションに追加します。
|
boolean |
offer(E e)
指定された要素を、このキューに容量制限に違反することなしにすぐに挿入できる場合には、そうします。成功した場合は true を返し、使用可能な空き領域がその時点で存在しない場合は false を返します。
|
boolean |
offer(E e, long timeout, TimeUnit unit)
指定された要素をこのキューに挿入します。必要に応じて、指定された時間まで空きが生じるのを待機します。
|
E |
poll(long timeout, TimeUnit unit)
このキューの先頭を取得して削除します。必要に応じて、指定された待機時間まで要素が利用可能になるのを待機します。
|
void |
put(E e)
指定された要素をこのキューに挿入します。必要に応じて、空きが生じるまで待機します。
|
int |
remainingCapacity()
理想的な状態 (メモリーやリソースの制限がない状態) で、このキューがブロックせずに受け入れることができる追加要素の数を返します。組み込み制限が存在しない場合は Integer.MAX_VALUE を返します。
|
boolean |
remove(Object o)
指定された要素の単一のインスタンスがこのキューに存在する場合は、キューから削除します。
|
E |
take()
このキューの先頭を取得して削除します。必要に応じて、要素が利用可能になるまで待機します。
|
boolean add(E e)
offer
を使用することをお勧めします。add
、インタフェース: Collection<E>
add
、インタフェース: Queue<E>
e
- 追加する要素Collection.add(E)
で指定されているとおり)IllegalStateException
- 容量制限のために、この時点で要素を追加できない場合ClassCastException
- 指定された要素のクラスが原因で、このキューにその要素を追加できない場合NullPointerException
- 指定された要素が null である場合IllegalArgumentException
- 指定された要素のあるプロパティーが原因で、このキューに要素を追加できない場合boolean offer(E e)
add(E)
よりもこのメソッドを使用することをお勧めします。offer
、インタフェース: Queue<E>
e
- 追加する要素ClassCastException
- 指定された要素のクラスが原因で、このキューにその要素を追加できない場合NullPointerException
- 指定された要素が null である場合IllegalArgumentException
- 指定された要素のあるプロパティーが原因で、このキューに要素を追加できない場合void put(E e) throws InterruptedException
e
- 追加する要素InterruptedException
- 待機中に割り込みが発生した場合ClassCastException
- 指定された要素のクラスが原因で、このキューにその要素を追加できない場合NullPointerException
- 指定された要素が null である場合IllegalArgumentException
- 指定された要素のあるプロパティーが原因で、このキューに要素を追加できない場合boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException
e
- 追加する要素timeout
- 処理を中止するまでの待機時間。単位は unitunit
- timeout パラメータの解釈方法を決定する TimeUnitInterruptedException
- 待機中に割り込みが発生した場合ClassCastException
- 指定された要素のクラスが原因で、このキューにその要素を追加できない場合NullPointerException
- 指定された要素が null である場合IllegalArgumentException
- 指定された要素のあるプロパティーが原因で、このキューに要素を追加できない場合E take() throws InterruptedException
InterruptedException
- 待機中に割り込みが発生した場合E poll(long timeout, TimeUnit unit) throws InterruptedException
timeout
- 処理を中止するまでの待機時間。単位は unitunit
- timeout パラメータの解釈方法を決定する TimeUnitInterruptedException
- 待機中に割り込みが発生した場合int remainingCapacity()
remainingCapacity を調べても要素の挿入試行が成功するかどうかがわかるとはかぎりません。これは別のスレッドが要素を挿入または削除しようとしている可能性があるためです。
boolean remove(Object o)
remove
、インタフェース: Collection<E>
o
- キューから削除される要素 (その要素が存在する場合)ClassCastException
- 指定された要素のクラスがこのキューと互換性のないクラスである場合 (オプション)NullPointerException
- 指定された要素が null の場合 (オプション)boolean contains(Object o)
contains
、インタフェース: Collection<E>
o
- このキューに含まれているかどうかを調べるオブジェクトClassCastException
- 指定された要素のクラスがこのキューと互換性のないクラスである場合 (オプション)NullPointerException
- 指定された要素が null の場合 (オプション)int drainTo(Collection<? super E> c)
c
- 要素の転送先のコレクションUnsupportedOperationException
- 指定されたコレクションで追加の要素がサポートされていない場合ClassCastException
- このキューの要素のクラスが原因で、その要素を指定されたコレクションに追加できない場合NullPointerException
- 指定されたコレクションが null である場合IllegalArgumentException
- 指定されたコレクションがこのキューである場合、またはこのキューの要素のあるプロパティーが原因で指定されたコレクションに追加できない場合int drainTo(Collection<? super E> c, int maxElements)
c
- 要素の転送先のコレクションmaxElements
- 転送する要素の最大数UnsupportedOperationException
- 指定されたコレクションで追加の要素がサポートされていない場合ClassCastException
- このキューの要素のクラスが原因で、その要素を指定されたコレクションに追加できない場合NullPointerException
- 指定されたコレクションが null である場合IllegalArgumentException
- 指定されたコレクションがこのキューである場合、またはこのキューの要素のあるプロパティーが原因で指定されたコレクションに追加できない場合 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.