首頁 > Java > java教程 > 如何使用Java的`wait()`和`notify()`方法來實作阻塞佇列?

如何使用Java的`wait()`和`notify()`方法來實作阻塞佇列?

Barbara Streisand
發布: 2024-11-23 09:42:31
原創
732 人瀏覽過

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

在Java 中使用Wait() 和Notify():帶有隊列的場景

問題:

您能否提供有關如何實現wait() 和notify()方法的全面演練有隊列嗎?

答案:

Wait()和Notify()原理

Wait()和notify () 透過讓執行緒在繼續之前等待滿足特定條件來啟用線程協調。在本例中,我們有興趣建立一個強制執行容量限制的阻塞佇列。

實作

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() 和 notification() 呼叫同步在同一物件上並放置在 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板