BlockingQueue
- 提供了可阻塞的put和take,和支持定时的offer和poll
- Queue可以是有界的或者无界的
- 支持了生产者-消费者的设计模式,将两个过程解耦
- 如果数据项添加队列失败,offer方法返回失败状态,这样可以创建更多灵活的策略来处理负荷过载的情况
- 多种实现:LinkedBlockingQueue,ArrayBlockingQueue,PriorityBlockingQueue, SynchronousQueue(直接交付,没有中间的存储过程)
生产者-消费者模式
- 一种常见的生产者-消费者的设计模式就是线程池+工作队列的组合,在Executor task execution框架中就体现了这种模式
- 举例:桌面搜索——将文件遍历(生产者)和建立索引(消费者)分解为独立的操作,每个功能的代码更加简单清晰,blockingqueue复制控制流
- 带来许多性能优势,生产者和消费者可以并发执行,特别是两者吞吐率差的很大时提高性能(设想如果桌面搜索的文件遍历和建立索引在一个线程中合在一起,整体的并行度降低为二者中更小的并行度)
双端队列和工作密取(Deques and Work Stealing)
- Java6增加了两种类型Deque和BlockingDeque,是双端队列
- Deque适合另一种工作模式——working stealing:如果一个消费者完成了自己Deque中的全部工作,那么它可以从其他消费者
- Working Stealing极大地减少了竞争
- 大多数时候,消费者都只是访问自己的Deque
- 需要访问另一个Deque是,会从尾部而不是头部获取
- 非常适用于既是消费者又是生产者的情形(比如网页爬虫处理一个页面,发现有更多的页面要处理)