ホームページ > Java > &#&チュートリアル > Java の `wait()` メソッドと `notify()` メソッドはブロッキング キューをどのように実装しますか?

Java の `wait()` メソッドと `notify()` メソッドはブロッキング キューをどのように実装しますか?

Patricia Arquette
リリース: 2024-11-23 05:56:16
オリジナル
727 人が閲覧しました

How Do Java's `wait()` and `notify()` Methods Implement a Blocking Queue?

Java の wait() と Notice(): キューを使用した簡単なシナリオ

Java では、wait() と Notify()メソッドは、スレッド同期のメカニズムを提供します。これらのメソッドを使用してブロッキング キューを実装できる簡単なシナリオを見てみましょう。

ブロッキング キューの実装

ブロッキング キューは、スレッドをブロックするキュー データ構造です。特定の条件が満たされない場合に特定の操作を実行しようとすること。私たちの実装では、put() メソッドと take() メソッドを実装します。これらは、キューが満杯または空の場合にそれぞれブロックします。

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;

    public BlockingQueue(int capacity) {
        this.capacity = capacity;
    }

    // Blocks if the queue is full (no space to insert)
    public synchronized void put(T element) throws InterruptedException {
        while (queue.size() == capacity) {
            wait();
        }

        queue.add(element);
        notifyAll();
    }

    // Blocks if the queue is empty (nothing to remove)
    public synchronized T take() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }

        T item = queue.remove();
        notifyAll();
        return item;
    }
}
ログイン後にコピー

Usage

それでは、このブロッキング キューの使用方法を見てみましょう。

BlockingQueue<Integer> queue = new BlockingQueue<>(10);

// Producer thread: adds elements to the queue
new Thread(() -> {
    for (int i = 0; i < 15; i++) {
        try {
            queue.put(i);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

// Consumer thread: retrieves elements from the queue
new Thread(() -> {
    for (int i = 0; i < 15; i++) {
        try {
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();
ログイン後にコピー

この例では、プロデューサー スレッドは要素をキューが容量制限に達するとブロックされます。コンシューマ スレッドは要素を取得し、キューが空になるとブロックします。

重要な考慮事項

  • 同期ブロックを使用する: wait()スレッドの安全性を確保し、見逃しを防ぐために、notify() を同期ブロック内で使用する必要があります。
  • while ループを使用します: while ループを使用して、偽のウェイクアップ (スレッドが通知されずに再アクティブ化された場合) による条件をチェックします。
  • Java 1.5 同時実行ライブラリを検討してください: Java 1.5 では、より高レベルの抽象化を備えた同時実行ライブラリが導入されました。 (例: ロックと条件)。これは、よりクリーンでより汎用性の高いアプローチを提供します。

以上がJava の `wait()` メソッドと `notify()` メソッドはブロッキング キューをどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート