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