首頁 > Java > java教程 > 如何使用 wait() 和 notify() 在 Java 中實作阻塞佇列?

如何使用 wait() 和 notify() 在 Java 中實作阻塞佇列?

Patricia Arquette
發布: 2024-12-29 06:12:16
原創
868 人瀏覽過

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

使用wait()和notify()實作阻塞佇列

簡介

在多執行緒程式設計中,wait()和notify()是用於線程同步。本文介紹如何使用 wait() 和 notification() 實作阻塞佇列,這是允許執行緒阻塞直到有項可用或空間可用的資料結構。

使用wait( 實現阻塞隊列) 和notification()

條件阻塞:

  • put() 方法: 阻塞,直到佇列中有可用空間。
  • take() 方法:阻塞,直到有可用的元素為止

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()和notify()時的注意事項

    使用wait()和notify()時的注意事項
  • 同步程式碼:
  • 在同步方法中呼叫wait()和notify()或
  • While 迴圈:
使用while 迴圈而不是if 語句來檢查由於虛假喚醒而導致的條件。

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();
        }
    }
}
登入後複製

以上是如何使用 wait() 和 notify() 在 Java 中實作阻塞佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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