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

Java の `wait()` メソッドと `notify()` メソッドを使用してブロッキング キューを実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-23 09:42:31
オリジナル
720 人が閲覧しました

How Can Java's `wait()` and `notify()` Methods Be Used to Implement a Blocking Queue?

Java での Wait() と Notify() の使用: キューを使用したシナリオ

質問:

wait() とQueue を使用した Notice() メソッド?

回答:

Wait() と Notify() の原則

Wait () と Notice() は、スレッドが特定の条件が満たされるまで待機してから続行することにより、スレッドの調整を可能にします。この場合、容量制限を強制するブロッキング キューの作成に興味があります。

実装

public class BlockingQueue<T> {

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

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

    public synchronized void put(T element) throws InterruptedException {
        while (queue.size() == capacity) {
            wait();
        }

        queue.add(element);
        notify(); // Notify waiting threads
    }

    public synchronized T take() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }

        T item = queue.remove();
        notify(); // Notify waiting threads
        return item;
    }
}
ログイン後にコピー

仕組み

  • Put()メソッド: キューがいっぱいの場合、現在のスレッドはスペースが利用可能であるという通知を受信するまで待機します。
  • Take() メソッド: キューが空の場合、現在のスレッドはスレッドは、要素が利用可能であるという通知を受け取るまで待機します。

注: wait() と Notice() の呼び出しは同じオブジェクト上で同期され、誤ったウェイクアップを処理するために while ループ内に配置されます。

Java 1.5 同時機能

Java 1.5 では java.util.concurrent パッケージが導入され、スレッド調整のための高レベルの抽象化が提供されました。この例の更新バージョンは次のとおりです。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;
    private Lock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();

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

    public void put(T element) throws InterruptedException {
        lock.lock();
        try {
            while (queue.size() == capacity) {
                notFull.await();
            }

            queue.add(element);
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public T take() throws InterruptedException {
        lock.lock();
        try {
            while (queue.isEmpty()) {
                notEmpty.await();
            }

            T item = queue.remove();
            notFull.signal();
            return item;
        } finally {
            lock.unlock();
        }
    }
}
ログイン後にコピー

このアプローチでは、ロックと条件を使用してスレッド調整を改善します。

BlockingQueue インターフェイスを検討してください

ブロッキング キューが必要な場合は、スレッド セーフで標準的な実装を提供する Java BlockingQueue インターフェイスの実装の使用を検討してください。容量制御の操作。

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

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