1、阻塞队列
阻塞队列与普通队列的区别在于,
当队列是空的时,从队列中获取元素的操作将会被阻塞,
或者当队列是满时,往队列里添加元素的操作会被阻塞。
试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。
同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列,
阻塞队列(Blocking queue)提供了可阻塞的put和take方法
它们与可定时的offer和poll是等价的。
如果Queue已经满了,put方法会被阻塞直到有空间可用;
**如果Queue是空的,那么take方法会被阻塞,直到有元素可用。**Queue的长度可以有限,也可以无限;无限的Queue永远不会充满,所以它的put方法永远不会阻塞。
2、消费者生产者模式
阻塞队列支持生产者-消费者设计模式。
一个生产者-消费者设计分离了“生产产品”和“消费产品”。生产者和消费者以不同的或者变化的速度生产和消费数据,生产者-消费者模式将这些活动解耦,因而简化了工作负荷的管理。
生产者-消费者模式可以把生产者和消费者的代码相互解耦合。
阻塞队列简化了消费者的编码,因为take会保持阻塞直到可用数据出现。如果生产者不能足够快地产生工作,让消费者忙碌起来,那么消费者只能一直等待,直到有工作可做。
同时,put方法的阻塞特性也大大地简化了生产者的编码;如果使用一个有界队列,那么当队列充满的时候,生产者就会阻塞,暂不能生成更多的工作,从而给消费者时间来赶进进度。
部分转自:
http://ifeve.com/blocking-queues/
http://blog.csdn.net/tingting256/article/details/52488651