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

Java BlockingQueue:ブロッキング操作を持つスレッドセーフキュー

Java BlockingQueue

JavaのBlockingQueueインターフェース、その実装、メソッドカテゴリ、実世界での活用法を探ります。

Javaコレクションフレームワークの一部であるBlockingQueueインターフェースはQueueを拡張し、ブロッキング動作を追加します。挿入や削除などの操作は、キューの状態がアクションを許可するまで自動的に待機します。

例えば、空のキューから要素を削除しようとすると、アイテムが利用可能になるまで呼び出しスレッドがブロックされ、プロデューサーとコンシューマー間の安全な調整を保証します。


具体的な実装クラス

BlockingQueueはインターフェースであるため、具体的なクラスが実際の機能を提供します:

Java BlockingQueue:ブロッキング操作を持つスレッドセーフキュー


BlockingQueueの使用

インスタンス作成前にパッケージをインポートします:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

インスタンス例:

// BlockingQueueの配列実装
BlockingQueue<String> animal1 = new ArrayBlockingQueue<>(10);
// BlockingQueueのLinkedList実装
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();

両オブジェクトはBlockingQueueインターフェースで定義されるすべてのメソッドをサポートします。


メソッドカテゴリ

BlockingQueueのメソッドは、キューが満杯または空の際の反応によってグループ化されます:

例外スロー型メソッド

戻り値型メソッド

タイムアウト付きバリアント

offerとpollはタイムアウトをサポートします:

boolean success = queue.offer(item, 100, TimeUnit.MILLISECONDS);

この例では、最大100ミリ秒アイテムの挿入を試み、タイムアウト時はfalseを返します。サポートされる時間単位にはdays、hours、minutes、seconds、milliseconds、microseconds、nanosecondsがあります。

ブロッキング型メソッド

これらのメソッドは、ビジーウェイトなしでスレッド同期が必要なプロデューサー・コンシューマーパターンで不可欠です。


ArrayBlockingQueueの例

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
public class Main {
    public static void main(String[] args) {
        // 容量5の有界ブロッキングキューを作成
        BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
        try {
            // 要素を挿入 - キューが満杯ならブロック
            numbers.put(2);
            numbers.put(1);
            numbers.put(3);
            System.out.println("BlockingQueue: " + numbers);
            // 要素を削除 - キューが空ならブロック
            int removedNumber = numbers.take();
            System.out.println("削除された数値: " + removedNumber);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println("操作が中断されました: " + e.getMessage());
        }
    }
}

出力

BlockingQueue: [2, 1, 3]
削除された数値: 2

詳細についてはArrayBlockingQueueの公式ドキュメントを参照してください。


なぜBlockingQueueを使うのか?

BlockingQueueの核心的利点は、その生来のスレッドセーフティにあります。複数のスレッドが同時にデータを生産・消費する際、明示的な同期が不要になります。

プロデューサー スレッドがコンシューマー スレッドより遅くアイテムを挿入する状況を考えてみてください。ブロッキング動作がないと、コンシューマーは例外をスローしたり、ビジーウェイトループで回ったりする可能性があります。BlockingQueueは、プロデューサーが新しいデータを用意するまでコンシューマーを自動的にサスペンドし、その逆も同様です。

これらの組み込みブロッキング メカニズムを活用することで、開発者は最小限のボイラープレートで堅牢かつスケーラブルな並行アプリケーションを構築できます。


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との比較