Java ArrayBlockingQueue:ブロッキングキューとスレッドセーフ操作の上級ガイド
Java ArrayBlockingQueue
JavaのArrayBlockingQueueを学習 - この固定サイズのブロッキングキューの作成、操作、スレッドセーフな使用法を明確な例で解説します。
JavaコレクションフレームワークのArrayBlockingQueueクラスは、配列をバックエンドとする有界でスレッドセーフなキューを提供します。BlockingQueueインターフェースを実装し、プロデューサーとコンシューマーがブロッキング操作で調整できるようにします。

ArrayBlockingQueueの作成
java.util.concurrent.ArrayBlockingQueueをインポートし、固定容量でインスタンス化します:
ArrayBlockingQueue<Type> queue = new ArrayBlockingQueue<>(capacity);
Typeは要素型、capacityは最大サイズです。
- 例 - サイズ5のStringキュー:
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); - 例 - サイズ5のIntegerキュー:
ArrayBlockingQueue<Integer> ages = new ArrayBlockingQueue<>(5);
注意:容量は必須で、キューの有界サイズを決定します。
ArrayBlockingQueueの主要メソッド
このクラスは、要素の挿入、アクセス、削除のためにBlockingQueueのすべてのメソッドを実装します。以下は最も頻繁に使用される操作です。
要素の挿入
add(E e)- 要素を追加。満杯時はIllegalStateExceptionをスローoffer(E e)- 要素を追加。満杯時はfalseを返す
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
animals.add("Dog");
animals.offer("Cat");
animals.offer("Horse");
System.out.println("ArrayBlockingQueue: " + animals);
出力: ArrayBlockingQueue: [Dog, Cat, Horse]
要素へのアクセス
peek()- 削除せずにヘッドを取得。空時はnulliterator()- キューのフェイルファストイテレータを提供
String head = animals.peek();
System.out.println("ヘッド要素: " + head);
Iterator<String> it = animals.iterator();
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
出力: ヘッド要素: Dogに続いて要素リスト
要素の削除
remove()- ヘッドを削除して返す。空時はNoSuchElementExceptionをスローpoll()- ヘッドを削除して返す。空時はnullを返すclear()- キューを空にする
String removed1 = animals.remove();
String removed2 = animals.poll();
animals.clear();
System.out.println("更新後のキュー: " + animals);
出力: 更新後のキュー: []
ブロッキング操作:put()とtake()
これらのメソッドはプロデューサー・コンシューマーパターンに不可欠です。操作が実行可能になるまでブロックし、スレッド調整を保証します。
put()
要素を挿入し、キューが満杯なら待機。InterruptedExceptionをスローする可能性があります。
try {
animals.put("Dog");
animals.put("Cat");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
take()
ヘッドを削除して返し、キューが空なら待機。InterruptedExceptionをスローする可能性があります。
try {
String element = animals.take();
System.out.println("削除された要素: " + element);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
その他の便利なメソッド
| メソッド | 説明 |
|---|---|
contains(Object o) | 指定要素がキューに含まれればtrueを返す |
size() | 現在の要素数を返す |
toArray() | キューを配列に変換 |
toString() | キューの文字列表現 |
なぜArrayBlockingQueueを使うのか?
以下を提供するためです:
- スレッドセーフティ: 並行アクセスのための組み込み同期
- 固定サイズ: 制御不能なメモリ増大を防止
- ブロッキング セマンティクス: プロデューサー・コンシューマー調整を簡素化
あるスレッドがコンシューマーより遅く生産する場合、コンシューマーは自動的にブロックされ、ビジーウェイトを回避し効率的なCPU使用を保証します。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較