Java中的阻塞队列

发生的两种情况

1.当队列元素满的时候,往队列里面放元素会受到阻塞。

2.当队列里面没有元素的时候,往队列里面取元素会取不到,从而导致阻塞在此,一直等待元素的到来。

 

应用场景:生产者和消费者模式

生产者和消费者之间增加队列(BlockingQueue),相当于是添加了一个中间商,让两者做到解耦。

BlockingQueue的常用实现类包含:

ArrayBlockingQueue:由数据结构组成的有界阻塞队列

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

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

DelayQueue:使用优先级队列实现的无界阻塞队列(内置优先级排序,用的是当前元素在队列的剩余时长,谁的最短谁放在最前优先被取出),支持延时获取。例:下单之后XX时间内付款。

LinkedBlockingQeque(不是Queue):双向阻塞队列

 

有界无界区别:

有限队列就是长度有限,满了以后生产者会阻塞,无界队列就是里面能放无数的东西而不会因为队列长度限制被阻塞,当然空间限制来源于系统资源的限制,如果处理不及时,导致队列越来越大越来越大,超出一定的限制致使内存超限,操作系统或者JVM帮你解决烦恼,直接把你 OOM kill 省事了。

无界也会阻塞,为何?因为阻塞不仅仅体现在生产者放入元素时会阻塞,消费者拿取元素时,如果没有元素,同样也会阻塞。

posted @ 2020-11-21 11:09  金大人的梦  阅读(125)  评论(0编辑  收藏  举报