工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java LinkedBlockingQueue完全マスター:包括的ガイドと実例

Java LinkedBlockingQueue

LinkedBlockingQueueクラス、その主要メソッド、実世界の例を通じて、Javaでのスレッドセーフなキューイングを解き放ちます。

Javaのjava.util.concurrentパッケージの一部であるLinkedBlockingQueueクラスは、リンクリストをバックエンドとするブロッキングキューを実装します。BlockingQueueインターフェースに準拠し、同時実行プロデューサー・コンシューマーシナリオ向けの堅牢でスレッドセーフな構造を提供します。

Java LinkedBlockingQueue完全マスター:包括的ガイドと実例


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);

例:

// 容量5のStringキュー
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
// 容量5のIntegerキュー
LinkedBlockingQueue<Integer> ages = new LinkedBlockingQueue<>(5);

注意:容量はオプション。省略すると無制限キューになります。


LinkedBlockingQueueの主要メソッド

このクラスはすべてのBlockingQueueメソッドを実装し、要素の挿入、取得、削除を可能にします。put()とtake()の2つのメソッドが、標準キューと区別されるブロッキング動作を提供します。

要素の挿入

例:

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]

要素へのアクセス

例:

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, 

要素の削除

例:

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

  1. Java演算子をマスター:種類、構文、実践例
  2. Javaコメント:種類、使い方、ベストプラクティス
  3. Java if…elseをマスター:制御フローを徹底解説
  4. Java拡張forループをマスター:構文、例、ベストプラクティス
  5. Java文字列をマスター:生成、メソッド、ベストプラクティス
  6. Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
  7. Java無名インナークラス完全ガイド:定義、構文、実践例
  8. Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
  9. Javaアノテーション完全ガイド:種類、配置場所、実践例
  10. Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
  11. Java Vectorの理解:使い方、特徴、ArrayListとの比較