Day5 队列:队列在有限线程池资源中的使用

小咪咪 2021-09-18 04:50 230阅读 0赞

主题:队列在有限线程池资源中的使用

  1. 问:什么是队列?
  2. 答:先进先出 FIFO,和栈一样,是一种操作受限的线性表数据结构
  3. 问:队列的操作?
  4. 答:入栈和出栈
  5. 问:有哪些队列?
  6. 答:
  7. 1. 循环队列
  8. 2. 阻塞队列
  9. 3. 并发队列
  10. 问:队列的实现方式?
  11. 答:链表和数组

基于链表的实现方式,可以实现一个支持无限排队的无界队列(unbounded queue),但是可能会导致过多的请求排队等待,请求处理的响应时间过长。所以,针对响应时间比较敏感的系统,基于链表实现的无限排队的线程池是不合适的。

而基于数组实现的有界队列(bounded queue),队列的大小有限,所以线程池中排队的请求超过队列大小时,接下来的请求就会被拒绝,这种方式对响应时间敏感的系统来说,就相对更加合理。不过,设置一个合理的队列大小,也是非常有讲究的。队列太大导致等待的请求太多,队列太小会导致无法充分利用系统资源、发挥最大性能。

队列实现示例:

  1. 数组
  2. public class ArrayQueue {
  3. private String[] items;
  4. private int n;
  5. private int tail;
  6. private int head;
  7. public ArrayQueue(int capacity) {
  8. items = new String[capacity];
  9. this.n = capacity;
  10. }
  11. // 入队
  12. public boolean enqueue(String item) {
  13. // 判断队列是否已满
  14. if(tail == n) return false;
  15. items[tail] = item;
  16. tail ++;
  17. return true;
  18. }
  19. // 出队
  20. public String dequeue() {
  21. // 判断是否有数据
  22. if (head == tail) return null;
  23. String tmp = items[head];
  24. head++;
  25. return tmp;
  26. }
  27. }

如下两幅图所示,当tail=7的时候,即使有空闲的空间,以上代码就无法添加了,需要重新搬移数据。

在这里插入图片描述watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dqYXZhZG9n_size_16_color_FFFFFF_t_70 1
那只需要修改入队代码:

  1. // 入队操作
  2. public boolean enqueueString item {
  3. // 表示 tail 已经到达数组终点,需要搬移数据了
  4. if (tail == n) {
  5. // 判断数组是否还有空间,如果没有了,返回 false
  6. if (head == 0) return false;
  7. // 如果还有空间,将head到tail这段数据进行搬移
  8. for(int i=head;i<tail;i++) {
  9. items[i-head] = items[i];
  10. head = 0;
  11. tail = tail - head;
  12. }
  13. }
  14. items[tail] = item;
  15. tail++;
  16. return true;
  17. }

在这里插入图片描述
循环队列数组示例代码

  1. public class CircularQueue {
  2. private String[] items;
  3. private int n;
  4. private int head;
  5. private int tail;
  6. public CircularQueue(int capacity) {
  7. items = new String[capacity];
  8. this.n = capacity;
  9. }
  10. // 入队
  11. public boolean enqueue(String item) {
  12. // 先判断队列是否已满
  13. if((tail+1) % n == head) return false;
  14. items[tail] = item;
  15. tail ++;
  16. return true;
  17. }
  18. // 出队
  19. public String dequeue() {
  20. // 判断队列是否为空
  21. if(tail == head) return null;
  22. String tmp = items[head];
  23. head = (head+1) % n;
  24. return tmp;
  25. }
  26. }

发表评论

表情:
评论列表 (有 0 条评论,230人围观)

还没有评论,来说两句吧...

相关阅读