Java的并發包中提供了一個BlockingQueue接口,它是一個支持線程安全的隊列,并且在隊列為空時會阻塞消費者線程,直到隊列不為空。在生產者線程向隊列中添加元素時,如果隊列已滿,則會阻塞生產者線程,直到隊列不滿。
BlockingQueue接口提供了以下常用的方法:
put(E e):將元素e添加到隊列的末尾,如果隊列已滿,則阻塞線程。
take():移除并返回隊列頭部的元素,如果隊列為空,則阻塞線程。
offer(E e):將元素e添加到隊列的末尾,如果隊列已滿,則返回false。
poll():移除并返回隊列頭部的元素,如果隊列為空,則返回null。
size():返回隊列中的元素個數。
下面是一個使用BlockingQueue的例子:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) {
// 創建一個大小為10的阻塞隊列
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
// 創建生產者線程
Thread producer = new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
// 將元素添加到隊列末尾
queue.put(i);
System.out.println("Producer: " + i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 創建消費者線程
Thread consumer = new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
// 從隊列中移除并返回頭部元素
int value = queue.take();
System.out.println("Consumer: " + value);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 啟動生產者和消費者線程
producer.start();
consumer.start();
}
}
上述例子中,創建了一個大小為10的BlockingQueue,生產者線程使用put方法將元素添加到隊列末尾,消費者線程使用take方法從隊列頭部移除元素。當隊列為空時,消費者線程會被阻塞,直到隊列不為空。當隊列已滿時,生產者線程會被阻塞,直到隊列不滿。