重新调整大小的Java BlockingQueue

重新调整大小的Java BlockingQueue,java,concurrency,blockingqueue,Java,Concurrency,Blockingqueue,因此,我在生产者/消费者类型的应用程序中使用固定大小的BlockingQueue[ArrayBlockingQueue],但我希望用户能够动态更改队列大小。问题在于,不存在允许在创建后更改容量的BlockingQueue实现。以前有人见过这个吗?有什么想法吗?您可以扩展LinkedBlockingQueue。它的限制是一个软限制(即,只是一个额外的检查),您可以对此进行更改(通过禁用内置限制并放入自己的限制)最明显的解决方案(可能适用,也可能不适用,取决于您的情况)是简单地实例化一个具有所需更新

因此,我在生产者/消费者类型的应用程序中使用固定大小的BlockingQueue[ArrayBlockingQueue],但我希望用户能够动态更改队列大小。问题在于,不存在允许在创建后更改容量的BlockingQueue实现。以前有人见过这个吗?有什么想法吗?

您可以扩展LinkedBlockingQueue。它的限制是一个软限制(即,只是一个额外的检查),您可以对此进行更改(通过禁用内置限制并放入自己的限制)

最明显的解决方案(可能适用,也可能不适用,取决于您的情况)是简单地实例化一个具有所需更新容量的新队列。然后将旧队列中的所有内容推送到新队列中。

如果这样做,则所有引用旧队列的线程都将被阻止,等待旧队列中的新内容,而不是新队列中的新内容。@bMail:这就是我说“取决于您的情况”的原因。如果OP多次引用阻止队列,然后,他需要重构以使此解决方案能够工作(例如,通过将队列本身包装在容器对象中,容器对象在外部充当队列,但在容量更改时在内部执行新分配)。如果不复制/粘贴大量内部代码,这是不可能的。你真的必须把链锯带到一个单独的实现中,例如Apache Harmony中的实现;太多是最终/私有的。我必须同意@jbellis的观点,在这种情况下,将
LinkedBlockingQueue
子类化是非常不切实际的。@Thau您只需要覆盖
offer()
put()
这些不是最终的。在
LinkedBlockingQueue
中,队列接口实现的所有访问和操作功能都使用
private final int capacity
字段,而且,整个锁定机制都保存在私有函数中,必须重新实现。你基本上是在写全班的大部分内容。