【问题标题】:Re-sizeable Java BlockingQueue可调整大小的 Java BlockingQueue
【发布时间】:2011-07-06 16:43:37
【问题描述】:

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

【问题讨论】:

    标签: java concurrency blockingqueue


    【解决方案1】:

    最明显的解决方案(根据您的情况可能合适,也可能不合适)是简单地实例化一个 new 队列,其中包含您想要的更新容量。然后将旧队列中的所有内容推送到新队列中。

    【讨论】:

    • 如果你这样做,那么所有引用旧队列的线程都将被阻塞,等待旧队列上的新内容,而不是新队列上的新内容。
    • @bkail:这就是我说“取决于你的情况”的原因。如果 OP 对阻塞队列有大量引用,那么他需要重构以使该解决方案发挥作用(例如,通过将队列本身包装在一个容器对象中,该容器对象在外部充当队列,但在容量为更改)。
    【解决方案2】:

    您可以扩展 LinkedBlockingQueue。它的限制是一个软限制(即只是一个额外的检查),你可以做一些你可以改变的事情(通过禁用内置的并放入你自己的)

    【讨论】:

    • 如果不复制/粘贴大量内部代码,这是不可能的。您确实必须将电锯带到单独的实现中,例如 Apache Harmony 中的那个。
    • 这里不能通过子类化得到想要的功能;太多是最终的/私人的。
    • 我必须同意@jbellis,在这种情况下继承LinkedBlockingQueue 是非常不切实际的。
    • @thrau 您只需要覆盖offer()put(),这些都不是最终的。
    • LinkedBlockingQueue 中队列接口实现的所有访问和操作函数都使用private final int capacity 字段,而且整个锁定机制都保存在私有函数中,必须重新实现。你基本上会重写大部分课程。
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2014-10-31
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2013-11-21
    • 2012-10-13
    相关资源
    最近更新 更多