首先我们先来看一下问题,当我们向固定大小的线程池中请求一个线程时,如果线程中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的?
先进者先出,这就是典型的“队列”。
栈支持操作: 入栈push() 出栈 pop() 队列支持的操作: 入队 enqueue() 出队 dequeue()
他们都是操作受限的数据结构
跟栈一样,队列可以用数组实现,也可以用链表来实现。用数组实现的栈叫作顺序栈,用链表实现的栈叫作链式栈;同样,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。
循环队列:把数组首尾相边 把链表变以成循环链表 变成一个环,这样就能避免数据搬移的问题。
阻塞队列:在队列基础上增加了阻塞操作。简单来说,就是在队列为空的时候,从队头取数据会被阻塞。如果队列已经满了,插入数据的操作就会被阻塞,直到队列中有空闲位置再插入数据。
我们可以使用阻塞队列,轻松实现一个“生产者-消费者模型”。这种场景可以有效地协调生产和消费的速度。当“生产者”生产数据的速度过快,“消费者”来不及消费时,存储数据的队列很快就会满了。这个时候,生产者就阻塞等待,直到“消费者”消费了数据,“生产者”才会被唤醒继续“生产”。
那么开始的问题我们一般有两种处理策略。第一种是非阻塞的处理方式,直接拒绝任务请求;另一种是阻塞的处理方式,将请求提成队,等到有空头线程时,取出排队的请求继续处理。