Java ブロッキング キュー
Java BlockingQueue
このチュートリアルでは、Java BlockingQueue インターフェイスとそのメソッドについて学習します。
BlockingQueue Java Collections のインターフェース フレームワークは Queue を拡張します インターフェース。正常に実行されるまで、すべての操作を待機させることができます。
たとえば、空のキューから要素を削除する場合、ブロッキング キューを使用すると、削除する要素がキューに含まれるまで削除操作を待機できます。
BlockingQueue を実装するクラス
BlockingQueue以降 はインターフェイスであるため、直接実装することはできません。
BlockingQueue の機能を使用するには 、それを実装するクラスを使用する必要があります。
- ArrayBlockingQueue
- LinkedBlockingQueue

ブロッキング キューの使用方法
java.util.concurrent.BlockingQueue をインポートする必要があります BlockingQueue を使用するためのパッケージ .
// Array implementation of BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
// LinkedList implementation of BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
ここでは、オブジェクト animal1 を作成しました と animal2 クラス ArrayBlockingQueue の および LinkedBlockingQueue 、 それぞれ。これらのオブジェクトは BlockingQueue の機能を使用できます
BlockingQueue のメソッド
キューが満杯か空かによって、ブロッキング キューのメソッドは次の 3 つのカテゴリに分けられます。
例外をスローするメソッド
add()- 要素をブロッキング キューの最後に挿入します。キューがいっぱいの場合、例外をスローします。element()- ブロッキング キューの先頭を返します。キューが空の場合、例外をスローします。remove()- ブロッキング キューから要素を削除します。キューが空の場合、例外をスローします。
何らかの値を返すメソッド
offer()- 指定された要素をブロッキング キューの最後に挿入します。falseを返します キューがいっぱいの場合peek()- ブロッキング キューの先頭を返します。nullを返します キューが空の場合poll()- ブロッキング キューから要素を削除します。nullを返します キューが空の場合
offer() と poll() の詳細
offer() および poll() メソッドはタイムアウトで使用できます。つまり、時間単位をパラメーターとして渡すことができます。たとえば、
offer(value, 100, milliseconds)
ここで、
- 値 キューに挿入される要素です
- そして、100 ミリ秒のタイムアウトを設定しました
これは offer() を意味します メソッドは 100 のブロッキング キューに要素を挿入しようとします。 ミリ秒。要素を 100 ミリ秒以内に挿入できない場合、メソッドは false を返します。 .
注: milliseconds の代わりに 、これらの時間単位も使用できます:days 、 hours 、 minutes 、 seconds 、 microseconds と nanoseconds offer() で と poll() メソッド。
操作をブロックするメソッド
BlockingQueue また、操作をブロックし、キューが満杯または空の場合に待機するメソッドも提供します。
put()- 要素をブロッキング キューに挿入します。キューがいっぱいの場合、キューに要素を挿入するスペースができるまで待機します。take()- ブロッキング キューから要素を削除して返します。キューが空の場合、キューに削除する要素が含まれるまで待機します。
要素をキューに挿入したいとします。キューがいっぱいの場合、put() メソッドは、キューに要素を挿入するスペースができるまで待機します。
同様に、キューから要素を削除したい場合。キューが空の場合、take() メソッドは、削除する要素がキューに含まれるまで待機します。
ArrayBlockingQueue での BlockingQueue の実装
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
class Main {
public static void main(String[] args) {
// Create a blocking queue using the ArrayBlockingQueue
BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
try {
// Insert element to blocking queue
numbers.put(2);
numbers.put(1);
numbers.put(3);
System.out.println("BLockingQueue: " + numbers);
// Remove Elements from blocking queue
int removedNumber = numbers.take();
System.out.println("Removed Number: " + removedNumber);
}
catch(Exception e) {
e.getStackTrace();
}
}
}
出力
BlockingQueue: [2, 1, 3] Removed Element: 2
ArrayBlockingQueue について詳しく知るには 、Java ArrayBlockingQueue にアクセスしてください。
BlockingQueue を使用する理由
Java では、BlockingQueue スレッドセーフと見なされます コレクション。これは、マルチスレッド操作に役立つ可能性があるためです。
あるスレッドが要素をキューに挿入し、別のスレッドが要素をキューから削除しているとします。
ここで、最初のスレッドの実行速度が遅い場合、ブロッキング キューにより、最初のスレッドが操作を完了するまで 2 番目のスレッドを待機させることができます。
Java