常用数据结构必知必会
王争
前Google工程师
立即订阅
1 人已学习
课程目录
已完结 5 讲
01 | 数组:为什么很多编程语言中数组都从0开始编号?
02 | 链表(上):如何实现LRU缓存淘汰算法?
03 | 链表(下):如何轻松写出正确的链表代码?
04 | 栈:如何实现浏览器的前进和后退功能?
05 | 队列:队列在线程池等有限资源池中的应用
常用数据结构必知必会
登录|注册

05 | 队列:队列在线程池等有限资源池中的应用

王争 2019-08-23
我们知道,CPU 资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致 CPU 频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事先设置的。
当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的呢?
实际上,这些问题并不复杂,其底层的数据结构就是我们今天要学的内容,队列(queue)。

如何理解“队列”?

队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列
我们知道,栈只支持两个基本操作:入栈 push()出栈 pop()。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。
所以,队列跟栈一样,也是一种操作受限的线性表数据结构
队列的概念很好理解,基本操作也很容易掌握。作为一种非常基础的数据结构,队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。比如高性能队列 Disruptor、Linux 环形缓存,都用到了循环并发队列;Java concurrent 并发包利用 ArrayBlockingQueue 来实现公平锁等。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《常用数据结构必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(3)

  • jamesxu
    循环队列的实现代码,出队中的“ head = (head + 1) % n;” 为什么不直接使用 head = (tail+1)%n 呢?你是不是写错了?

    作者回复: 没,你再理解一下,举个例子,自己画画

    2019-08-29
    1
    2
  • ClassNotFoundException
    定时任务的处理,订单的处理,生产消息的消费都需要队列的排队
    2019-08-30
  • jamesxu
    它们分别指向链表的第一个结点和最后一个结点。//“结点”?

    极客时间版权所有: https://time.geekbang.org/column/article/118700
    2019-08-29
收起评论
3
返回
顶部