阻塞队列

概念、生产者消费者模式 

1)当队列满的时候,插入元素的线程被阻塞,直达队列不满。数组

2)队列为空的时候,获取元素的线程被阻塞,直到队列不空。缓存

生产者和消费者模式

生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,若是生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。一样的道理,若是消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,便有了生产者和消费者模式。生产者和消费者模式是经过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而是经过阻塞队列来进行通讯,因此生产者生产完数据以后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就至关于一个缓冲区,平衡了生产者和消费者的处理能力。多线程

经常使用方法 

方法spa

抛出异常线程

返回值排序

一直阻塞接口

超时退出队列

插入方法ci

addelement

offer

put

Offer(time)

移除方法

remove

poll

take

Poll(time)

检查方法

element

peek

N/A

N/A

  1. 抛出异常:当队列满时,若是再往队列里插入元素,会抛出IllegalStateException("Queuefull")异常。当队列空时,从队列里获取元素会抛出NoSuchElementException异常。
  2. 返回特殊值:当往队列插入元素时,会返回元素是否插入成功,成功返回true。若是是移除方法,则是从队列里取出一个元素,若是没有则返回null。
  3. 一直阻塞:当阻塞队列满时,若是生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到队列可用或者响应中断退出。当队列空时,若是消费者线程从队列里take元素,队列会阻塞住消费者线程,直到队列不为空。
  4. 超时退出:当阻塞队列满时,若是生产者线程往队列里插入元素,队列会阻塞生产者线程一段时间,若是超过了指定的时间,生产者线程就会退出。

 

经常使用阻塞队列 

·ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。

按照先进先出原则,要求设定初始大小

·LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。

按照先进先出原则,能够不设定初始大小,Integer.Max_Value

ArrayBlockingQueue和LinkedBlockingQueue不一样:

  1. 锁上面:ArrayBlockingQueue只有一个锁,LinkedBlockingQueue用了两个锁,
  2. 实现上:ArrayBlockingQueue直接插入元素,LinkedBlockingQueue须要转换。

·PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。

默认状况下,按照天然顺序,要么实现compareTo()方法,指定构造参数Comparator

·DelayQueue:一个使用优先级队列实现的无界阻塞队列。

支持延时获取的元素的阻塞队列,元素必需要实现Delayed接口。适用场景:实现本身的缓存系统,订单到期,限时支付等等。

·SynchronousQueue:一个不存储元素的阻塞队列。

每个put操做都要等待一个take操做

·LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。

transfer(),必需要消费者消费了之后方法才会返回,tryTransfer()不管消费者是否接收,方法都当即返回。

·LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

能够从队列的头和尾均可以插入和移除元素,实现工做密取,方法名带了First对头部操做,带了last从尾部操做,另外:add=addLast; remove=removeFirst; take=takeFirst

阻塞队列的实现原理

好比,ArrayBlockingQueue就是基于Lock和Condition实现的。

相关文章
相关标签/搜索