目录
问题引出
一.单端阻塞队列(BlockingQueue)
二.双端阻塞队列(BlockingDeque)
三.延迟队列(DelayQueue)
由于实现消费者-生产者模型,每一次实现都比较麻烦,比如sychronized的同步处理,或者通过锁实现。这些实现起来都比较繁琐,为了简单就能实现这种模型,JUC提供了阻塞队列接口:BlockingQueue(单端阻塞队列)和BlockingDeque(双端阻塞队列)
原理:通过使用FIFO模式处理的集合结构
什么是FIFO?
FIFO(First-In, First-Out)是一种常见的处理数据的方式,也被称为先进先出模式。在FIFO模式中,首先进入队列的数据首先被处理,而最后进入队列的数据最后被处理。
可以将FIFO模式理解为排队等候的情景,比如在超市的收银台,顾客按照先后顺序排队结账。当一个顾客结完账离开后,下一个顾客才能开始结账。这就是FIFO模式的处理顺序。
在计算机科学中,FIFO模式通常用于数据缓冲区、队列和调度算法等场景。例如,在操作系统中,进程调度算法可以使用FIFO模式,根据进程到达的先后顺序来决定执行顺序;在网络通信中,消息队列可以使用FIFO模式确保消息按照发送的先后顺序被接收和处理。
单端阻塞队列BlockQueue的常用方法:
单端阻塞队列接口BlockingQueue提供多个子类ArrayBlockingQueue(数组结构)、LinkedBlockingQueue(链表单端阻塞队列)、PriorityBlockingQueue(优先级阻塞队列)、SynchronousQueue(同步队列)
ArrayBlockingQueue
案例代码:
上述代码修改后如下
讯享网

注意:阻塞队列虽然解决了数据存满则线程等待的情况,但是并没有解决线程并发的问题
LinkedBlockingQueue
案例代码:
讯享网

PriorityBlockingQueue

的特点是:
- 元素按照优先级进行排序。在示例中,较小的数字具有较高的优先级。
- 插入和移除操作的时间复杂度为O(logN),其中N为队列中的元素个数。
SynchronousQueue
讯享网
的特点是:
- 队列没有容量,每次插入操作必须等待对应的删除操作,反之亦然。
- 插入和删除操作是成对的,即一个元素的插入必须等待其被消费取出。
实现子类之间的区别:
- (数组结构阻塞队列):
- 基于数组实现的有界队列,具有固定容量。
- 具有公平(FIFO)和非公平(默认)两种策略的可选择性。
- 内部使用单个锁来实现线程安全。
- 插入和移除元素的时间复杂度为O(1)。
- (链表单端阻塞队列):
- 基于链表实现的可选有界或无界队列。
- 默认情况下是无界的,但可以指定最大容量来创建有界队列。
- 内部使用两个锁来实现线程安全,一个用于插入操作,一个用于移除操作。
- 插入和移除元素的时间复杂度为O(1)。
- (优先级阻塞队列):
- 基于堆实现的无界优先级队列。
- 元素按照优先级进行排序,优先级通过元素的自然顺序或者自定义比较器进行确定。
- 内部不允许存储元素。
- 插入和移除元素的时间复杂度为O(logN),其中N为队列中的元素个数。
- (同步队列):
- 一个没有缓冲区的阻塞队列,用于线程之间直接传输元素。
- 每个插入操作必须等待相应的移除操作,反之亦然。
- 队列本身不存储元素,仅用于线程之间的数据传递。
- 插入和移除操作通常具有较高的可伸缩性性能。
BlockingDeque ,可以实现FIFO与FILO操作
什么是FILO?

- FILO(First-In, Last-Out)是一种数据处理方式,也被称为后进先出模式。在FILO模式中,最后进入的数据会首先被处理,而最先进入的数据会最后被处理。
- 可以将FILO模式理解为堆叠物品的情景,比如在一个书架上放置书籍。当我们将一本新书放在书架上时,它会被放在已有书籍的顶部,因此最后放置的书会处于最上方。当我们需要取出一本书时,会优先从顶部取出最后放置的那本书。这符合FILO模式的处理顺序。
- 在计算机科学中,FILO模式常用于栈(Stack)数据结构的操作。栈是一种具有特定数据插入和删除规则的数据结构,最后插入的数据会成为栈顶,最先插入的数据会成为栈底。当需要访问或移除数据时,我们通常会先操作栈顶的数据。
- 总之,FILO模式即后进先出模式,用于保持数据处理顺序的一种方式。类似于堆叠物品或栈数据结构,最后进入的数据会首先被处理,而最先进入的数据会最后被处理。
BlockingDeque 的常用方法:
双端阻塞队列只有一个实现的子类LinkedBlockingDeque
案例代码:

可以看到双端情况下可以将数据放在头或者尾,获取也可以获取头和尾
在JUC中提供自动弹出数据延迟的队列DelayQueue,该类属于BlockingQueue的实现子类。如果是创建类对象插入到延迟队列中的话,类需要继承Delayed,并且覆写 compareTo()和getDelay()方法
原理:
- 延迟时间计算:每个元素实现了 Delayed 接口,该接口定义了一个 getDelay(TimeUnit unit) 方法,用于计算当前元素距离延迟时间还有多长时间。这个方法返回一个 long 类型的时间值,表示时间单位内的延迟时间。
- 队列存储:内部使用有序优先队列(PriorityQueue)来存储元素。元素将根据它们的延迟时间进行排序,即最小的延迟时间的元素将排在队头。
- 元素添加:调用 offer(E e) 方法将一个元素添加到队列中。插入元素时,根据其延迟时间,决定其位置。
- 元素获取:调用 take() 方法从队列中取出延迟时间到达的元素。如果队列为空,则线程阻塞等待,直到有元素可以取出。
- 添加与移除的同步:对队列的添加和移除操作进行同步,以确保多线程环境下的安全性。
- 定时删除:元素在队列中的保存时间一旦超过其延迟时间,将会被自动删除。
常用方法:
案例代码:
讯享网


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/161782.html