【问题标题】:How to customize blocking behavior of BlockingQueue如何自定义 BlockingQueue 的阻塞行为
【发布时间】:2012-01-05 13:54:20
【问题描述】:

我想创建一个阻塞队列,它根据自定义规则而不是队列中的项目数来阻塞生产者。

例如:

Producer 生成一些文件并放入队列中。消费者经过一些分析后将它们转移到特定位置。

对于上述情况,如果队列中的总文件大小达到某个阈值,我希望生产者等待生成新文件。如果总大小不超过阈值,队列可以接受任意数量的文件。

【问题讨论】:

  • 到现在为止你找到解决办法了吗?
  • 这是一个非常古老的问题。而且我还没有在任何实际应用程序中使用阻塞队列。所以在那之后我并没有很努力地寻找解决方案。
  • 我也有同样的需求,找不到现成的东西。我可能只是从 Java 中复制粘贴 LinkedBlockingQueue 的代码(由 Doug Lea 编写)并修改检查“容量”和“计数”的现有逻辑以实际调用自定义检查或其他内容。想不出任何更简单/更短的方法。

标签: java queue


【解决方案1】:

我可能会将BlockingQueue 子类化,例如ArrayBlockingQueue,并添加一个简单的CountDownLatch,它被初始化为阈值并在达到0 时启用各种take/remove 方法。

【讨论】:

  • 我期待 java 提供的一些内置机制通过覆盖某些方法或其他无法猜测的方法来自定义阻塞行为。因为可以根据需要更改规则。
  • 我可以看到这样的课程是如何有用的。我不完全确定我理解你的要求。如果take 应该阻塞直到队列中有 10 个元素,那么我应该能够 take 十个元素,还是必须等待 9 个元素再次变为 10 个?
  • 对于当前场景,take 不会等到队列为空。但是如果文件的总大小(不是文件数)超过阈值,put 将等待。假设 thrashhold 值为 5mb,如果队列有 1000 个 5 KB 的文件或 100 个 50 KB 的文件(粗略),put 将等待。
  • 我建议使用组合而不是继承来修改阻塞队列的行为。
  • @Ivan,你是对的。这可能更有意义。无论如何,您可能必须实现 BlockingQueue 的所有方法。
【解决方案2】:

我认为您必须自己实现这种锁定机制。您可以使用 wait/notify 或 ReentrantLock/Condition,一个保存组合长度的长变量和一个保存文件的 LinkedList。

【讨论】:

  • 这是我的解决方案队列中的最后一个选项,正如@aioobe 所建议的那样。 :)
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2010-10-23
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多