Java中的阻塞队列
发生的两种情况
1.当队列元素满的时候,往队列里面放元素会受到阻塞。
2.当队列里面没有元素的时候,往队列里面取元素会取不到,从而导致阻塞在此,一直等待元素的到来。
应用场景:生产者和消费者模式
生产者和消费者之间增加队列(BlockingQueue),相当于是添加了一个中间商,让两者做到解耦。
BlockingQueue的常用实现类包含:
ArrayBlockingQueue:由数据结构组成的有界阻塞队列
LinkedBlockingQueue:由链表结构组成的有界阻塞队列
PriorityBlockingQueue:支持优先级排序的无界阻塞队列
DelayQueue:使用优先级队列实现的无界阻塞队列(内置优先级排序,用的是当前元素在队列的剩余时长,谁的最短谁放在最前优先被取出),支持延时获取。例:下单之后XX时间内付款。
LinkedBlockingQeque(不是Queue):双向阻塞队列
有界无界区别:
有限队列就是长度有限,满了以后生产者会阻塞,无界队列就是里面能放无数的东西而不会因为队列长度限制被阻塞,当然空间限制来源于系统资源的限制,如果处理不及时,导致队列越来越大越来越大,超出一定的限制致使内存超限,操作系统或者JVM帮你解决烦恼,直接把你 OOM kill 省事了。
无界也会阻塞,为何?因为阻塞不仅仅体现在生产者放入元素时会阻塞,消费者拿取元素时,如果没有元素,同样也会阻塞。