java - 获取 ArrayBlockingQueue 的容量
问题描述
我需要将 ArrayBlockingQueue 容量缩小 1。
我在想没有什么比这更容易的了:
- 获取当前队列的容量。
- 创建一个新队列
capacity - 1
- 使用该
BlockingQueue.drainTo
函数将旧队列中的任何元素移至新队列。 - 休息一天……
但是,我在第 1 步完全被窃听了。由于某些不可思议的原因,ArrayBlockingQueue 没有公开容量。我想不出这是私有的原因,它是一个有界队列并提供getRemainingCapacity
方法,为什么我无法获得容量?
我不能这样做size() + getRemainingCapacity()
,因为这是一个并发队列,总是有可能在 size 和 getRemainingCapacity 调用之间更改队列。
当然,我不是第一个需要 ArrayBlockingQueue 容量的人。没有扩展整个类来添加一个getCapacity
方法,或者创建一个单独的结构来映射我的队列的容量,是否有一个简单的解决方案?
或者也许是不应该知道容量的明智原因?(除了疏忽)
更多背景:我的多线程程序使用了许多队列,它调用BlockingQueue.getRemainingCapacity
函数来了解队列何时已满,然后从那里处理它。在一个罕见的极端情况下,程序在填充它的过程中发现队列容量太大了 1 个元素。我需要将队列的大小减少 1,否则它永远不会填满,也永远不会得到处理。
解决方案
现在,我要和这个...
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;
}
}
我觉得它不应该只是为了获得容量而需要扩展。
推荐阅读
- javascript - 在 Firestore 中通过类型为“reference”的字段进行查询
- javascript - 如何在keyup事件的angularjs中两秒后发送请求?
- java - 如何使用 Android firebase-realtime-database 中的 CardView 在 RecyclerView 中显示数据?
- braintree - Braintree 创建具有动态价格的订阅
- c++ - 列表迭代器无法返回迭代器
- babeljs - 在构建时面临`找不到模块'@babel/plugin-transform-react-jsx'`
- apache-kafka - 我应该如何在 apache kafka 中选择我的日志压缩类型?
- f# - 用格式打印是打印引号吗?
- java - Android ProgressBar hiving NullPointerException android.widget.ProgressBar.setVisibility(int) NullPointerException
- angular - 更新Angular中嵌套数组中的对象