ホームページ > Java > &#&チュートリアル > Java でブロッキング キューを実装するために「wait()」と「notify()」をどのように使用できますか?

Java でブロッキング キューを実装するために「wait()」と「notify()」をどのように使用できますか?

Patricia Arquette
リリース: 2024-12-29 06:12:16
オリジナル
868 人が閲覧しました

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

wait() と Notice() を使用したブロッキング キューの実装

はじめに

マルチスレッド プログラミングでは、wait() と Notify() は次のとおりです。スレッドの同期に使用されます。この記事では、wait() と Notice() を使用してブロッキング キューを実装する方法について説明します。ブロッキング キューは、項目が使用可能になるかスペースが使用可能になるまでスレッドをブロックできるようにするデータ構造です。

wait( を使用したブロッキング キューの実装) ) とnotify()

の条件ブロック:

  • put() メソッド: キューに空き領域ができるまでブロックします。
  • take() メソッド: で使用可能な要素が存在するまでブロックします。 queue.

Java コード:

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(); // notifyAll() for multiple producer/consumer threads
    }

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

        T item = queue.remove();
        notify(); // notifyAll() for multiple producer/consumer threads
        return item;
    }
}
ログイン後にコピー

wait() および Notice() を使用する場合の考慮事項

  • 同期コード: 同期メソッド内で wait() と Notice() を呼び出すか、 block.
  • while ループ: 偽のウェイクアップによる条件をチェックするには、if ステートメントの代わりに while ループを使用します。

Java 1.5 同時実行ライブラリ

Java 1.5 では、より高いレベルを提供する同時実行ライブラリが導入されました。抽象化:

変更されたブロッキング キューの実装:

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();
        }
    }
}
ログイン後にコピー

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

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