您的位置:首页 > 产品设计 > UI/UE

【Java并发】阻塞队列BlockingQueue和生产者-消费者模型笔记

2018-04-01 10:55 597 查看

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java