可调整大小的Java BlockingQueue

问题描述 投票:9回答:3

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

java concurrency blockingqueue
3个回答
2
投票

最明显的解决方案(根据您的具体情况,可能合适或可能不合适)将只是实例化具有所需更新容量的new队列。然后将所有内容从旧队列推送到新队列。


1
投票

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


0
投票

为什么不使用PriorityBlockingQueue而不是ArrayBlockingQueue

这是我自己的问题的故事。

对于供应方,我使用PriorityBlockingQueue存储需要处理的Thing列表。我选择该类是因为它是不受限制的,并且如果它为空,则尝试从该类获取将被阻止。完美。

[对于需求方,我错误地选择了ArrayBlockingQueue,因为我想到我会从供应方获取Thing并将其放入需求方;如果我尝试放入太多东西,则阻止。最初看起来很完美。

除外,应该允许用户更改可以同时处理的Thing的数量。然后我意识到必须重新创建具有不同容量的ArrayBlockingQueue时遇到同步问题。

我应该做的是创建PriorityBlockingQueue的另一个实例以保存Worker的列表。管理器将从Worker队列中取出,然后从Thing队列中取出。如果没有可用的Worker,则管理器将阻止。

Thing.execute在其Thread中完成后,如果工作程序的数量低于用户选择的阈值,则会将其Worker添加到Worker队列中。

您要做的就是将更改同步到该阈值变量。因此,增大或减小该阈值是一个[[非常简单的事情。

如果增加阈值变量,则将Worker的新实例添加到工作队列。但是,当您减小阈值变量时,您什么也不做。垃圾收集器将清理最终将成为孤立的Worker

创建Worker类的想法可能会极大地促进其他地方的事情,因为Worker可能具有可以一遍又一遍地重复使用的功能,而这些功能在设置时可能会很昂贵。

© www.soinside.com 2019 - 2024. All rights reserved.