所以我在生产者/消费者类型的应用程序中使用固定大小的BlockingQueue [ArrayBlockingQueue],但是我希望用户能够即时更改队列大小。问题在于没有一个BlockingQueue实现允许创建后更改容量。有人遇到过吗?有什么想法吗?
最明显的解决方案(根据您的具体情况,可能合适或可能不合适)将只是实例化具有所需更新容量的new队列。然后将所有内容从旧队列推送到新队列。
您可以扩展LinkedBlockingQueue。它的限制是一个软限制(即,只是一项额外的检查),您可以对此进行更改(通过禁用内置选项并放入自己的选项)
为什么不使用PriorityBlockingQueue
而不是ArrayBlockingQueue
?
这是我自己的问题的故事。
对于供应方,我使用PriorityBlockingQueue
存储需要处理的Thing
列表。我选择该类是因为它是不受限制的,并且如果它为空,则尝试从该类获取将被阻止。完美。
[对于需求方,我错误地选择了ArrayBlockingQueue
,因为我想到我会从供应方获取Thing
并将其放入需求方;如果我尝试放入太多东西,则阻止。最初看起来很完美。
除外,应该允许用户更改可以同时处理的Thing
的数量。然后我意识到必须重新创建具有不同容量的ArrayBlockingQueue
时遇到同步问题。
我应该做的是创建PriorityBlockingQueue
的另一个实例以保存Worker
的列表。管理器将从Worker
队列中取出,然后从Thing
队列中取出。如果没有可用的Worker
,则管理器将阻止。
Thing.execute
在其Thread
中完成后,如果工作程序的数量低于用户选择的阈值,则会将其Worker
添加到Worker
队列中。
您要做的就是将更改同步到该阈值变量。因此,增大或减小该阈值是一个[[非常简单的事情。
如果增加阈值变量,则将Worker
的新实例添加到工作队列。但是,当您减小阈值变量时,您什么也不做。垃圾收集器将清理最终将成为孤立的Worker
。创建Worker
类的想法可能会极大地促进其他地方的事情,因为Worker
可能具有可以一遍又一遍地重复使用的功能,而这些功能在设置时可能会很昂贵。