首页 > 解决方案 > 获取 ArrayBlockingQueue 的容量

问题描述

我需要将 ArrayBlockingQueue 容量缩小 1。

我在想没有什么比这更容易的了:

  1. 获取当前队列的容量。
  2. 创建一个新队列capacity - 1
  3. 使用该BlockingQueue.drainTo函数将旧队列中的任何元素移至新队列。
  4. 休息一天……

但是,我在第 1 步完全被窃听了。由于某些不可思议的原因,ArrayBlockingQueue 没有公开容量。我想不出这是私有的原因,它是一个有界队列并提供getRemainingCapacity方法,为什么我无法获得容量?

我不能这样做size() + getRemainingCapacity(),因为这是一个并发队列,总是有可能在 size 和 getRemainingCapacity 调用之间更改队列。

当然,我不是第一个需要 ArrayBlockingQueue 容量的人。没有扩展整个类来添加一个getCapacity方法,或者创建一个单独的结构来映射我的队列的容量,是否有一个简单的解决方案?

或者也许是不应该知道容量的明智原因?(除了疏忽)

更多背景:我的多线程程序使用了许多队列,它调用BlockingQueue.getRemainingCapacity函数来了解队列何时已满,然后从那里处理它。在一个罕见的极端情况下,程序在填充它的过程中发现队列容量太大了 1 个元素。我需要将队列的大小减少 1,否则它永远不会填满,也永远不会得到处理。

标签: javaqueue

解决方案


现在,我要和这个...

import java.util.concurrent.ArrayBlockingQueue;

@SuppressWarnings("serial")
public class InformativeBlockingQueue<E> extends ArrayBlockingQueue<E>
{
    private final int visibleCapacity;
    
    public InformativeBlockingQueue(int capacity)
    {
        super(capacity, false);
        this.capacity = capacity;
    }

    public InformativeBlockingQueue(int capacity, boolean fair)
    {
        super(capacity, fair);
        this.visibleCapacity = capacity;
    }
    
    public int getCapacity()
    {
        return visibleCapacity;
    }
}

我觉得它不应该只是为了获得容量而需要扩展。


推荐阅读