BlockingQueue
是 Java 并發編程庫 java.util.concurrent
中的一個接口,它提供了一種線程安全的隊列,可以用于在生產者和消費者線程之間傳遞數據。BlockingQueue
支持阻塞操作,當隊列滿時,生產者線程會被阻塞,直到有空間可用;當隊列為空時,消費者線程會被阻塞,直到有元素可供消費。
阻塞操作的實現主要依賴于 Java 的 synchronized
關鍵字和 Object
類的 wait()
、notify()
和 notifyAll()
方法。這些方法和關鍵字提供了一種機制,使得線程可以等待某個條件(例如隊列中有空間或有元素可供消費)滿足時繼續執行。
以下是 BlockingQueue
阻塞操作的簡化實現:
public void put(E e) throws InterruptedException {
synchronized (this) {
while (queue.isFull()) {
wait(); // 等待隊列不滿
}
queue.add(e);
notifyAll(); // 通知消費者線程,隊列中有新元素
}
}
public E take() throws InterruptedException {
synchronized (this) {
while (queue.isEmpty()) {
wait(); // 等待隊列非空
}
E item = queue.remove();
notifyAll(); // 通知生產者線程,隊列中有空間
return item;
}
}
在這個簡化的示例中,put
和 take
方法都使用了 synchronized
關鍵字來確保線程安全。當隊列滿時,生產者線程會調用 wait()
方法進入等待狀態,直到有其他線程調用 notifyAll()
通知它們隊列中有空間。同樣,當隊列為空時,消費者線程會調用 wait()
方法進入等待狀態,直到有其他線程調用 notifyAll()
通知它們隊列中有新元素。
注意:上述代碼只是為了說明 BlockingQueue
的阻塞操作原理,并不是實際的 BlockingQueue
實現。實際的 BlockingQueue
實現(如 ArrayBlockingQueue
、LinkedBlockingQueue
等)會更加復雜,并且會提供額外的功能和優化。