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的阻塞队列 BlockingQueuequeue = 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 = https://www.yisu.com/ask/queue.take();"Consumer: " + value); } } catch (InterruptedException e) { e.printStackTrace(); } }); // 启动生产者和消费者线程 producer.start(); consumer.start(); } }
上述例子中,创建了一个大小为10的BlockingQueue,生产者线程使用put方法将元素添加到队列末尾,消费者线程使用take方法从队列头部移除元素。当队列为空时,消费者线程会被阻塞,直到队列不为空。当队列已满时,生产者线程会被阻塞,直到队列不满。