阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列。
适用场景:
BlockingQueue通常用于一个线程生产对象,而另一个线程消费对象的场景。
一个线程往里面放,另一个线程从里面取的一个BlockingQueue。
生产线程,一个线程将会持续生产新对象并将其插入到队列中去,直到队列达到它所能容纳的临界点。如果该阻塞队列到达了临界点,负责生产的线程将会在往里面插入新对象时发生阻塞。它会一个处于阻塞中,直到负责消费的线程从队列中拿走一个对象。
消费线程,负责消费的线程将会一直从该阻塞队列中拿出对象。如果消费线程尝试去从一个空的队列中提取对象的话,这个消费线程将会处于阻塞之中,直到一个生产线程把一个对象丢进队列。
BlockingQueue的方法
四组不同的行为方式解释:
- 抛异常:如果试图操作无法立即执行,抛一个异常
- 特定值:如果试图操作无法立即执行,返回一个特定的值(true或false)
- 阻塞:如果试图操作无法立即执行,该方法调用将会发生阻塞,直到能够执行
- 超时:如果试图操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。返回一个特定值以告知该操作是否成功
无法向一个BlockingQueue中插入null。如果试图插入null,BlockingQueue会抛出一个NullPointException。
可以访问到 BlockingQueue 中的所有元素,而不仅仅是开始和结束的元素。比如说,你将一个对象放入队列之中以等待处理,但你的应用想要将其取消掉。那么你可以调用诸如 remove(o) 方法来将队列之中的特定对象进行移除。但是这么干效率并不高(译者注:基于队列的数据结构,获取除开始或结束位置的其他对象的效率不会太高),因此你尽量不要用这一类的方法,除非你确实不得不那么做。
BlockingQueue的实现
BlockingQueue接口的实现类:
- ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列
- DelayQueue:一个使用优先级队列实现的无界阻塞队列
- LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列
- PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列
- SynchronousQueue:一个不存储元素的阻塞队列