Java中的ArrayBlockingQueue poll()方法
介绍
ArrayBlockingQueue是一个基于数组实现的阻塞队列,它的大小固定且不能动态扩容,其内部实现是一个循环数组。poll()方法是ArrayBlockingQueue中的一个阻塞式方法,它用于从队列头部取出元素,如果队列为空,则一直等待直到队列中有元素可取。
语法
public E poll() throws InterruptedException
参数
无
返回值
如果队列为空,返回null,否则返回取出的元素。
示例
下面是一个使用ArrayBlockingQueue的示例,其中线程producer不断向队列queue中添加元素,线程consumer不断从队列中取出元素。当队列已满时,producer线程会阻塞等待,当队列为空时,consumer线程会阻塞等待。
import java.util.concurrent.ArrayBlockingQueue;
public class Example {
public static void main(String[] args) throws InterruptedException {
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(5);
// 生产者线程
Thread producer = new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
queue.put("item" + i);
System.out.println("producer put item" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 消费者线程
Thread consumer = new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
String item = queue.take();
System.out.println("consumer take " + item);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
producer.start();
consumer.start();
producer.join();
consumer.join();
}
}
运行上述代码,可以看到如下输出:
producer put item0
producer put item1
producer put item2
consumer take item0
producer put item3
producer put item4
producer put item5
consumer take item1
producer put item6
producer put item7
producer put item8
consumer take item2
producer put item9
consumer take item3
consumer take item4
consumer take item5
consumer take item6
consumer take item7
consumer take item8
consumer take item9
可以看到,当队列已满时,producer线程被阻塞,等待consumer线程取出一个元素后才能继续往队列中添加元素;当队列为空时,consumer线程被阻塞,等待producer线程往队列中添加元素后才能取出元素。
结论
ArrayBlockingQueue通过阻塞式方法实现了多线程环境下的线程安全,而poll()方法则是其中的一种阻塞式方法,它用于从队列头部取出元素,如果队列为空,则一直等待直到队列中有元素可取。在实际开发中,使用ArrayBlockingQueue可以方便地实现生产者-消费者模型。
极客笔记