zoukankan      html  css  js  c++  java
  • 【Java并发】阻塞队列BlockingQueue和生产者-消费者模型笔记

    阻塞队列BlockingQueue

    BlockingQueue是线程安全的一个阻塞队列,常用于生产者-消费者模式中。

    BlockingQueue是一个先进先出的队列(当然这是普通队列也有的性质)。其中常用的操作如下:

    put()和take()

    两个都是阻塞的操作。即当队列已满时put,将会一直等待,直到队列不为满时再put。同理,当队列为空时take,也将会一直等待,直到队列不为空时,从队列头部拿取一个元素(get并remove)。

    put和take是最常用的两个方法,也是唯一的两个阻塞方法。其他方法说明如下:

    add(E o); //将指定的元素添加到此队列中(如果立即可行),在成功时返回 true,其他情况则抛出 IllegalStateException。 
    
    drainTo(Collection<? super E> c):移除此队列中所有可用的元素,并将它们添加到给定 collection 中。  
    
    drainTo(Collection<? super E> c,int maxElements);//最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中  
    
    offer(E o);  //如果可能的话,将指定元素插入此队列中。  
    
    offer(E o, long timeout, TimeUnit unit);  //将指定的元素插入此队列中,如果没有可用空间,将等待指定的等待时间(如果有必要)。 
    
    poll(long timeout, TimeUnit unit);  //检索并移除此队列的头部,如果此队列中没有任何元素,则等待指定等待的时间(如果有必要)。
    
    put(E o);    //将指定元素添加到此队列中,如果没有可用空间,将一直等待(如果有必要)。  
    
    remainingCapacity();  //返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的元素数量;如果没有内部限制,则返回 Integer.MAX_VALUE。  
    
    take();  //检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。

    生产者-消费者模型

    生产者-消费者模式是为了解决两个组件之间的速度差异,以调高系统的效率。主要原理就是利用一个阻塞队列进行数据共享。若A生产的产品(数据)速度很快,而B消费产品的速度很慢,则A就将产品放到队列中,A可以继续生产,而不是一直等待;同理B从队列消费产品,而不是A生产一个B消费一个,这样就提高了效率并且降低了耦合度。

  • 相关阅读:
    题解 POJ1149 Pigs
    题解 【网络流24题】运输问题
    题解 【网络流24题】太空飞行计划
    题解 【网络流24题】方格取数问题
    题解 密码锁
    题解 【重庆八中模拟赛】寻找代表元
    题解 [SHOI2010]最小生成树
    题解 【ZJOI2009】 假期的宿舍
    题解 [ZJOI2008]树的统计Count
    JSP页面中的pageEncoding和contentType两种属性(转)
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286710.html
Copyright © 2011-2022 走看看