温馨提示×

Java并发之BlockingQueue的使用

小云
103
2023-08-11 14:41:04
栏目: 编程语言

Java的并发包中提供了一个BlockingQueue接口,它是一个支持线程安全的队列,并且在队列为空时会阻塞消费者线程,直到队列不为空。在生产者线程向队列中添加元素时,如果队列已满,则会阻塞生产者线程,直到队列不满。

BlockingQueue接口提供了以下常用的方法:

  1. put(E e):将元素e添加到队列的末尾,如果队列已满,则阻塞线程。

  2. take():移除并返回队列头部的元素,如果队列为空,则阻塞线程。

  3. offer(E e):将元素e添加到队列的末尾,如果队列已满,则返回false。

  4. poll():移除并返回队列头部的元素,如果队列为空,则返回null。

  5. 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方法从队列头部移除元素。当队列为空时,消费者线程会被阻塞,直到队列不为空。当队列已满时,生产者线程会被阻塞,直到队列不满。

0