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