【专栏】数据结构和算法之美-队列:队列在线程池等有限资源池中的应用

本文主要是介绍【专栏】数据结构和算法之美-队列:队列在线程池等有限资源池中的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习笔记

如何理解“队列”?

结构特征
  • 操作受限的线性表数据结构
  • 两端开放,一端是数据的入口,另一端是数据的出口
行为特征
  • 先进先出,类似于水管,从一端进水,另一端出水,先进去的水会先流出来

如何实现队列?

基于数组实现:顺序队列
/*Queue implement based on the array*/
/*Queue implement based on the linked list*/
/*Circl Queue implement based on the array*/#include <stdio.h>#define QUEUE_LEN 8
#define TRUE (unsigned short)1
#define FALSE (unsigned short)0typedef unsigned short bool;static int queueArray[QUEUE_LEN];bool inQueue(int data, int *phead, int *ptail)
{bool ret = FALSE;int currentIndex = *ptail;int n = 0;if(*ptail == QUEUE_LEN){/*it is full*/for(; n < ((*ptail) - (*phead)); n++){queueArray[n] = queueArray[(*phead) + n];}*phead = 0;if(n < QUEUE_LEN){queueArray[n] = data;*ptail = n + 1;ret = TRUE;}else{printf("error! queue is full\n");ret = FALSE;}}else{queueArray[currentIndex] = data;*ptail = currentIndex+1;ret = TRUE;}return (ret);}int outQueue(int *phead, int *ptail)
{int ret = 0;int currentIndex = *phead;if(*ptail == *phead){return -1;}else{ret = queueArray[currentIndex];*phead = currentIndex + 1;}return ret;
}void main(void)
{int tail = 0;int head = 0;int data = 1;int n = 0;for (; n < QUEUE_LEN; n++){inQueue(data, &head, &tail);data += 1;}printf("###########test 1: new data cann't enter while the queue is full: %d\n", inQueue(9,&head, &tail));printf("###########test 2: data leave from the queue: %d\n", outQueue(&head, &tail));printf("************head=%d, tail=%d, the latest leaving value is %d\n", head, tail, queueArray[head -1]);printf("***********test 3: new data can enter even though tail reaches the end of the queue\n");inQueue(10, &head, &tail);printf("************tail's position:%d, the latest entering value is %d\n", tail, queueArray[tail - 1]);
}

循环队列

结构特征
  • 首尾相连,成环形
  • 对于用数组实现的非循环队列,队满条件tail == n,队空条件head == tail。 而循环队列,队满特征是(tail+1)%n=head;
    -在这里插入图片描述
行为特征
  • 新元素添加进来后,如果达到队满条件,tail在环中后移一位,而不是直接加1
特殊特性的队列

阻塞队列特征

  • 队空时,从对头取数据会被阻塞
  • 队满时,插入数据操作会被阻塞
  • Linux环形缓存
  • 在这里插入图片描述
    阻塞队列是“生产者-消费者模型”的一种实现策略。
    而在多线程情况下,多个线程同时操作队列,如下,有多个线程同时从队头取数据,保证线程安全的队列我们就叫作并发队列,那么如何实现它呢?(看实战篇的Disruptor)
    在这里插入图片描述
    关于线程池会用到队列排队请求?

这篇关于【专栏】数据结构和算法之美-队列:队列在线程池等有限资源池中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668701

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队