Java LinkedBlockingQueue完全マスター:包括的ガイドと実例
Java LinkedBlockingQueue
LinkedBlockingQueueクラス、その主要メソッド、実世界の例を通じて、Javaでのスレッドセーフなキューイングを解き放ちます。
Javaのjava.util.concurrentパッケージの一部であるLinkedBlockingQueueクラスは、リンクリストをバックエンドとするブロッキングキューを実装します。BlockingQueueインターフェースに準拠し、同時実行プロデューサー・コンシューマーシナリオ向けの堅牢でスレッドセーフな構造を提供します。

LinkedBlockingQueueの作成
このキューを使用するには、java.util.concurrent.LinkedBlockingQueueをインポートします:
import java.util.concurrent.LinkedBlockingQueue;
1. 初期容量なし
LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>();
デフォルト容量はInteger.MAX_VALUE(231–1)で、実質的に無制限のキューになります。
2. 容量指定あり
LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>(int capacity);
Type- 要素型(例:String、Integer)capacity- キューが保持できる最大要素数
例:
// 容量5のStringキュー
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
// 容量5のIntegerキュー
LinkedBlockingQueue<Integer> ages = new LinkedBlockingQueue<>(5);
注意:容量はオプション。省略すると無制限キューになります。
LinkedBlockingQueueの主要メソッド
このクラスはすべてのBlockingQueueメソッドを実装し、要素の挿入、取得、削除を可能にします。put()とtake()の2つのメソッドが、標準キューと区別されるブロッキング動作を提供します。
要素の挿入
add(E e)- 要素を追加。キューが満杯なら例外をスローoffer(E e)- 要素を追加。キューが満杯ならfalseを返す
例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
animals.add("Dog");
animals.add("Cat");
animals.offer("Horse");
System.out.println("LinkedBlockingQueue: " + animals);
}
}
出力
LinkedBlockingQueue: [Dog, Cat, Horse]
要素へのアクセス
peek()- ヘッド要素を削除せずに取得。空時はnulliterator()- キューのフェイルセーフイテレータを提供。使用にはjava.util.Iteratorのインポートが必要
例:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("LinkedBlockingQueue: " + animals);
String head = animals.peek();
System.out.println("アクセスされた要素: " + head);
Iterator<String> it = animals.iterator();
System.out.print("LinkedBlockingQueue要素: ");
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
出力
LinkedBlockingQueue: [Dog, Cat, Horse] アクセスされた要素: Dog LinkedBlockingQueue要素: Dog, Cat, Horse,
要素の削除
remove()- ヘッドを削除して返す。空時は例外をスローpoll()- ヘッドを削除して返す。空時はnullを返すclear()- すべての要素を削除
例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("LinkedBlockingQueue: " + animals);
String removed = animals.remove();
System.out.println("remove()使用: " + removed);
String polled = animals.poll();
System.out.println("poll()使用: " + polled);
animals.clear();
System.out.println("更新後のLinkedBlockingQueue: " + animals);
}
}
出力
LinkedBlockingQueue: [Dog, Cat, Horse] remove()使用: Dog poll()使用: Cat 更新後のLinkedBlockingQueue: []
ブロッキング操作:put() と take()
並行コンテキストでは、put()とtake()が呼び出しスレッドをブロックし、操作が進行可能になるまで待機します。これによりプロデューサーとコンシューマー間の安全な調整が保証されます。
put()
要素を末尾に挿入し、キューが満杯なら待機します。
例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
try {
animals.put("Dog");
animals.put("Cat");
System.out.println("LinkedBlockingQueue: " + animals);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
出力
LinkedBlockingQueue: [Dog, Cat]
take()
ヘッド要素を取得して削除し、キューが空ならブロックします。
例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
try {
animals.put("Dog");
animals.put("Cat");
System.out.println("LinkedBlockingQueue: " + animals);
String removed = animals.take();
System.out.println("削除された要素: " + removed);
System.out.println("新しいLinkedBlockingQueue: " + animals);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
出力
LinkedBlockingQueue: [Dog, Cat] 削除された要素: Dog 新しいLinkedBlockingQueue: [Cat]
その他のユーティリティメソッド
| メソッド | 説明 |
|---|---|
contains(Object o) | キューが指定要素を保持するか確認 |
size() | 現在の要素数を返す |
toArray() | キューを配列に変換 |
toString() | キューの文字列表現を提供 |
なぜLinkedBlockingQueueを選ぶのか?
内部的にリンクリストを使用するため、LinkedBlockingQueueは以下を提供します:
- 最初からスレッドセーフ
- バックプレッシャー制御のためのオプション有界容量
- プロデューサーとコンシューマーを自然に調整するブロッキングメソッド
あるスレッドがもう一方より遅く生産するマルチスレッドアプリケーションでは、キューは新しいアイテムが到着するまでコンシューマーを自動的にサスペンドし、ビジーウェイトを防ぎCPUオーバーヘッドを削減します。
高性能な並行ワークロードでは、Java並行APIはプロデューサー・コンシューマーパイプラインの定番構造としてLinkedBlockingQueueを推奨しています。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較