ArrayBlockingQueue实现了BlockingQueue接口。关于BlockingQueue的内容可以参考:juc02 阻塞队列—BlockingQueue
ArrayBlockingQueue是有界的阻塞队列,内部使用数组存储元素,有界意味着它不能存储无限数量的元素,它存储的元素数量是有上限的,你可以在初始化的时候设置容量,之后这个容量就不能再改变了。
ArrayBlockingQueue内部按先进先出(FIFO)的顺序存储元素,头部元素是在队列中存储时间最长的,尾部元素是在队列中存储时间最短的。
下面展示了如何初始化和使用ArrayBlockingQueue:
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");
Object object = queue.take();
下面是一个使用了java泛型的BlockingQueue案例:
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();
下面是一个使用ArrayBlockingQueue实现的一个生产者消费者案例:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class TestArrayBlockingQueue {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
Thread producer = new Thread(() -> {
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(1000);
System.out.println("生产者生产i:" + i);
blockingQueue.add("i:" + i);
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread consumer = new Thread(() -> {
for (int i = 0; i < 3; i++){
try {
System.out.println("消费者消费" + blockingQueue.take());
} catch (Exception e) {
e.printStackTrace();
}
}
});
producer.start();
consumer.start();
}
}
运行截图: