1)当队列满的时候,插入元素的线程被阻塞,直达队列不满。数组
2)队列为空的时候,获取元素的线程被阻塞,直到队列不空。缓存
生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,若是生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。一样的道理,若是消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,便有了生产者和消费者模式。生产者和消费者模式是经过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而是经过阻塞队列来进行通讯,因此生产者生产完数据以后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就至关于一个缓冲区,平衡了生产者和消费者的处理能力。多线程
方法spa |
抛出异常线程 |
返回值排序 |
一直阻塞接口 |
超时退出队列 |
插入方法ci |
addelement |
offer |
put |
Offer(time) |
移除方法 |
remove |
poll |
take |
Poll(time) |
检查方法 |
element |
peek |
N/A |
N/A |
·ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
按照先进先出原则,要求设定初始大小
·LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
按照先进先出原则,能够不设定初始大小,Integer.Max_Value
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实现的。