juc阻塞队列(阻塞队列poll)

juc阻塞队列(阻塞队列poll)目录 问题引出 一 单端阻塞队列 BlockingQueu 二 双端阻塞队列 BlockingDequ 三 延迟队列 DelayQueue 由于实现消费者 生产者模型 每一次实现都比较麻烦 比如 sychronized 的同步处理 或者通过锁实现

大家好,我是讯享网,很高兴认识大家。



目录

问题引出

 一.单端阻塞队列(BlockingQueue)

二.双端阻塞队列(BlockingDeque)

三.延迟队列(DelayQueue)


由于实现消费者-生产者模型,每一次实现都比较麻烦,比如sychronized的同步处理,或者通过锁实现。这些实现起来都比较繁琐,为了简单就能实现这种模型,JUC提供了阻塞队列接口:BlockingQueue(单端阻塞队列)和BlockingDeque(双端阻塞队列)

原理:通过使用FIFO模式处理的集合结构

什么是FIFO?

FIFO(First-In, First-Out)是一种常见的处理数据的方式,也被称为先进先出模式。在FIFO模式中,首先进入队列的数据首先被处理,而最后进入队列的数据最后被处理。

可以将FIFO模式理解为排队等候的情景,比如在超市的收银台,顾客按照先后顺序排队结账。当一个顾客结完账离开后,下一个顾客才能开始结账。这就是FIFO模式的处理顺序。

在计算机科学中,FIFO模式通常用于数据缓冲区、队列和调度算法等场景。例如,在操作系统中,进程调度算法可以使用FIFO模式,根据进程到达的先后顺序来决定执行顺序;在网络通信中,消息队列可以使用FIFO模式确保消息按照发送的先后顺序被接收和处理。

单端阻塞队列BlockQueue的常用方法:

方法 描述 将指定的项放入队列中,如果队列已满则阻塞,直到有空间可用 从队列中获取并移除一个项,如果队列为空则阻塞,直到有项可取 尝试将指定的项放入队列中,如果队列已满则立即返回false,否则返回true 从队列中获取并移除一个项,在指定的超时时间内如果队列为空则返回null 返回队列中的第一个项,但不对队列进行修改,如果队列为空则返回null 返回队列中当前的项数 检查队列是否为空 检查队列是否已满 清空队列,移除所有的项

单端阻塞队列接口BlockingQueue提供多个子类ArrayBlockingQueue(数组结构)、LinkedBlockingQueue(链表单端阻塞队列)、PriorityBlockingQueue(优先级阻塞队列)、SynchronousQueue(同步队列)

ArrayBlockingQueue

案例代码:

上述代码修改后如下


讯享网

 
   
讯享网

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

LinkedBlockingQueue

案例代码:

讯享网

PriorityBlockingQueue

 

的特点是:

  • 元素按照优先级进行排序。在示例中,较小的数字具有较高的优先级。
  • 插入和移除操作的时间复杂度为O(logN),其中N为队列中的元素个数。

SynchronousQueue

讯享网

的特点是:

  • 队列没有容量,每次插入操作必须等待对应的删除操作,反之亦然。
  • 插入和删除操作是成对的,即一个元素的插入必须等待其被消费取出。

 实现子类之间的区别:

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

BlockingDeque ,可以实现FIFO与FILO操作

什么是FILO?

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

BlockingDeque 的常用方法:

方法 描述 将指定的项添加到双端队列的开头,如果队列已满则抛出异常 将指定的项添加到双端队列的末尾,如果队列已满则抛出异常 尝试将指定的项添加到双端队列的开头,如果队列已满则立即返回false,否则返回true 尝试将指定的项添加到双端队列的末尾,如果队列已满则立即返回false,否则返回true 将指定的项放入双端队列的开头,如果队列已满则阻塞,直到有空间可用 将指定的项放入双端队列的末尾,如果队列已满则阻塞,直到有空间可用 从双端队列的开头获取并移除一个项,在指定的超时时间内如果队列为空则返回null 从双端队列的末尾获取并移除一个项,在指定的超时时间内如果队列为空则返回null 从双端队列的开头获取并移除一个项,如果队列为空则阻塞,直到有项可取 从双端队列的末尾获取并移除一个项,如果队列为空则阻塞,直到有项可取 返回双端队列的开头项,但不对队列进行修改,如果队列为空则抛出异常 返回双端队列的末尾项,但不对队列进行修改,如果队列为空则抛出异常 返回双端队列的开头项,但不对队列进行修改,如果队列为空则返回null 返回双端队列的末尾项,但不对队列进行修改,如果队列为空则返回null 返回双端队列中当前的项数 检查双端队列是否为空 清空双端队列,移除所有的项

双端阻塞队列只有一个实现的子类LinkedBlockingDeque

案例代码:

 
     

可以看到双端情况下可以将数据放在头或者尾,获取也可以获取头和尾


在JUC中提供自动弹出数据延迟的队列DelayQueue,该类属于BlockingQueue的实现子类。如果是创建类对象插入到延迟队列中的话,类需要继承Delayed,并且覆写 compareTo()和getDelay()方法

原理:

  1. 延迟时间计算:每个元素实现了 Delayed 接口,该接口定义了一个 getDelay(TimeUnit unit) 方法,用于计算当前元素距离延迟时间还有多长时间。这个方法返回一个 long 类型的时间值,表示时间单位内的延迟时间。
  2. 队列存储:内部使用有序优先队列(PriorityQueue)来存储元素。元素将根据它们的延迟时间进行排序,即最小的延迟时间的元素将排在队头。
  3. 元素添加:调用 offer(E e) 方法将一个元素添加到队列中。插入元素时,根据其延迟时间,决定其位置。
  4. 元素获取:调用 take() 方法从队列中取出延迟时间到达的元素。如果队列为空,则线程阻塞等待,直到有元素可以取出。
  5. 添加与移除的同步:对队列的添加和移除操作进行同步,以确保多线程环境下的安全性。
  6. 定时删除:元素在队列中的保存时间一旦超过其延迟时间,将会被自动删除。

常用方法:

方法名 描述 将指定的 入队,并在 毫秒后执行。 出队并返回最早的延迟任务。 返回指定 的剩余延迟时间(以毫秒为单位),如果 已经过期则返回负数。 从队列中移除指定的 。 返回队列中延迟任务的数量。 判断队列是否为空。 清空队列,移除所有的延迟任务。 返回所有已过期的任务,并从队列中移除它们。 返回下一个即将过期的任务,但不从队列中移除它。

 案例代码:

讯享网



小讯
上一篇 2025-06-12 14:43
下一篇 2025-06-09 08:37

相关推荐

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