• 【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消费一个,这样就提高了效率并且降低了耦合度。

  • 相关阅读:
    vs 视图其它窗口命令窗口
    WPF 翻转动画实现(转)
    ASP.NET的后台代码和前台JS代码相互调用
    LINQ学习心得分享(三)LINQ语法详解2
    LINQ学习心得分享(二)LINQ语法详解
    《AJAX学习心得分享(三)AJAX+JSON无刷新加载大量后台数据》
    A simple poem
    LINQ学习心得分享(五)LINQ TO SQL实用详解
    LINQ学习心得分享(四)LINQ TO XML实用解析
    AJAX学习心得分享(一)AJAX初识+原生态AJAX
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286710.html
Copyright © 2020-2023  润新知