队列知识点

前言

cpu的资源是有限的,任务处理的速度和线程的个数不是线性相关。相反,过多的线程反而会导致cpu频繁切换,处理性能下降。
当我们向固定大小的线程池请求一个线程时,线程池中没有空闲的资源了,这个时候线程池如何处理请求。这时候我们引入了队列这个数据结构。

1.当我们想对顶大小的线程池中请求一个线程时候,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?拒绝请求还是排队请求?

队列的应用很广泛,比如循环队列、阻塞队列、并发队列。
高性能队列disruptor、linux环形存储
java concurrent利用arrayblockingqueue实现公平锁

循环队列
  • 循环队列的难点在于确定队空和队满的判定条件。
    循环队列tail指向的位置上式没有存储数据的,因此循环队列会浪费一个数组的存储空间。
    队列满的条件为:(tail+1)%n==head
    队列空的条件为:tail==head
    正是因为队满和队空的条件需要不相同,所以循环队列会浪费一个存储单元。
public class CircularQueue {
  // 数组:items,数组大小:n
  private String[] items;
  private int n = 0;
  // head 表示队头下标,tail 表示队尾下标
  private int head = 0;
  private int tail = 0;

  // 申请一个大小为 capacity 的数组
  public CircularQueue(int capacity) {
    items = new String[capacity];
    n = capacity;
  }

  // 入队
  public boolean enqueue(String item) {
    // 队列满了
    if ((tail + 1) % n == head) return false;
    items[tail] = item;
    tail = (tail + 1) % n;
    return true;
  }

  // 出队
  public String dequeue() {
    // 如果 head == tail 表示队列为空
    if (head == tail) return null;
    String ret = items[head];
    head = (head + 1) % n;
    return ret;
  }
}

阻塞队列和并发队列
  • 1.阻塞队列:在队列的基础上增加了阻塞操作,当队列为空的时候,从队头取数据会被阻塞。如果队列已经满了,那么插入数据的操作会被阻塞,直到队伍中有空闲位置再插入数据,然后再返回。
  • 2.上面的定义是一个典型的生产者-消费者模型。当生产者的数据生产过快,存储数据的队列很快就满了这是生产者就要阻塞等待,直到消费者消费了数据,生产者才会继续生产。
  • 3.并发队列,最简单直接的方式在enqueue和的queue的方法上枷锁。

问题:线程池没有空闲线程时,新的任务请求线程资源时,线程池该如何处理?
  • 第一种是非阻塞的处理方式,直接拒绝任务请求;另一种是阻塞的处理方式,等优空闲线程的时候,去除排队的请求继续处理。
问题:基于链表和数组实现等待队列的区别?

*链表:实现了一个无限排队的队列,但是过多等待请求会是请求处理的响应时间过长,基于链表实现的无限排队是不合适的。
*基于数组:队列大小有限,队列太大等待请求太多,队列太小无法充分利用系统资源,发挥最大性能。
队列可以应用在任何有限资源池中,用于排队请求,比如数据库连接池等。对于大部分资源有限的场景,当没有空闲资源时,基本上都可以通过队列实现请求排队。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
C语言中的优先队列是一种特殊的队列数据结构,其中每个元素都有一个与之关联的优先级。优先级高的元素先被处理,而优先级相同的元素按照它们被插入的顺序进行处理。 在C语言中,可以使用以下几种方式来实现优先队列: 1. 数组实现:使用数组来存储元素,并根据元素的优先级进行排序。插入元素时,需要按照优先级找到合适的位置进行插入;删除元素时,直接删除数组中的第一个元素即可。这种实现方式简单直观,但插入和删除操作的时间复杂度较高。 2. 堆实现:使用堆这种数据结构来实现优先队列。堆是一种完全二叉树,足堆序性质:对于每个节点i,其父节点的值小于等于节点i的值。在C语言中,可以使用数组来表示堆。插入元素时,将元素插入到堆的末尾,并通过上浮操作将其调整到合适的位置;删除元素时,将堆顶元素与最后一个元素交换,并通过下沉操作将其调整到合适的位置。这种实现方式的插入和删除操作的时间复杂度为O(log n),效率较高。 3. 链表实现:使用链表来存储元素,并根据元素的优先级进行排序。插入元素时,需要按照优先级找到合适的位置进行插入;删除元素时,直接删除链表中的第一个元素即可。这种实现方式相对于数组实现来说,插入和删除操作的时间复杂度较低,但查找操作的时间复杂度较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值