阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法。如果队列已经满了,那么put方法将阻塞直到有空间可用;如果队列为空,那么take方法将会阻塞直到有元素可用。队列可以是有界的也可以是无界的,无界队列永远都不会充满,因此无界队列上的put方法也永远不会阻塞。
阻塞队列支持生产者-消费者这种设计模式。
生产者-消费者模式的好处:
1. 把"找到需要完成的工作"和"执行工作"这两个过程分离开来,并把工作项放到一个"待完成"列表中以便在随后处理,而不是立即处理。
2. 生产者-消费者模式能简化开发过程,因为它消除了生产者和消费者之间的代码依赖性。
3. 此外,还可以将生产数据的过程与使用数据的过程解耦开来以简化工作负载的管理,因为这两个过程的处理速率有所不同。
生产者不需要知道消费者的标识或数量,或者它们是否是唯一的生产者,而只需要将数据放入队列即可。同样消费者也不需要知道生产者是谁,或者工作来自何处。
BlockingQueue简化了生产者-消费者设计的实现过程,它支持任意数量的生产者和消费者。一种最常见的生产者-消费者设计模式就是线程池与工作队列的组合,在Executor执行任务框架就体现了这种设计模式。
生产者和消费者的角色是相对的,某种环境中的消费者在另一种不同的环境中可能成为生产者。
生产者和消费者模式可以将生产者和消费者的代码彼此解耦,但是它们的行为会通过共享工作队列间耦合在一起。如果消费者处理工作的速率能赶上生产者生成工作项的速率,通常不会为工作队列的大小设置边界,但这会导致之后需要重新设计系统架构。应该尽早地通过阻塞队列在设计中构建资源管理机制——这件事做得越好越容易。