Java并发编程实践笔记之—阻塞队列和生产者-消费者模式(Blocking Queues and the Producer-consumer Pattern)

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极大地减少了竞争
    1. 大多数时候,消费者都只是访问自己的Deque
    2. 需要访问另一个Deque是,会从尾部而不是头部获取
  • 非常适用于既是消费者又是生产者的情形(比如网页爬虫处理一个页面,发现有更多的页面要处理)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值