队列(queue):
队列在线程池等有限资源池中的应用。
我们知道,CPU资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致CPU频繁
切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件资源,来事先设置的。
当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源,这个时候线程池如何处理这个请求?是
拒绝请求还是排队请求?各种处理策略又是怎么实现的呢?
实际上,这些问题并不复杂,其底层的数据结构就是,队列。
如何理解队列:
队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者
先出,这就是典型的“队列”。
我们知道,栈只支持两个基本操作:入栈push()和出栈pop()。队列跟栈非常相似,支持的操作也很有限,最基本的
操作也是两个:入队enqueue(),放一个数据到队列尾部;出队dequeue(),从队列头部取一个元素。
所以,队列跟栈一样,也是一种非常基础的数据结构,队列的应用也非常广泛,特别是一些具有某些特性的队列,
比如循环队列,阻塞队列,并发队列。他们在很多偏底层系统,框架,中间件的开发中,起着关键性的作用。比如高性能
队列Disruptor,Linux环形缓存,都用到了循环并发队列;Java concurrent并发包利用ArrayBlockingQueue来实现
公平锁等。