【问题标题】:Is there any concurrent queue that allow N consumers to consume the item N times separately?是否有任何并发​​队列允许 N 个消费者分别消费该项目 N 次?
【发布时间】:2014-02-05 06:21:40
【问题描述】:

我对队列的期望如下:

假设队列包含 A-B-C-D-E。我有 3 个消费者。我需要的是所有消费者在出列 A 之前消费项目 A 并继续消费 B。

也就是说,所有消费者都获得了队列中的所有项目。我有权衡解决方案,即 3 个消费者使用 3 ArrayBlockingQueue。但我想知道是否有这样的队列。

【问题讨论】:

    标签: java multithreading concurrency java.util.concurrent


    【解决方案1】:

    您描述的要求是发布/订阅设计模式。它由 JMS 提供者(例如 ActiveMQ)实现。

    【讨论】:

      【解决方案2】:

      不,没有。不过,这听起来很容易实现。想到的一些选项是:

      1. 在要消费的对象中包含一个CountDownLatch,只有当它到达0时才丢弃该项目
      2. 让两个消费者不消费该项目(查看队列而不是弹出队列)
      3. 不要使用消费者,使用监听器

      或者如果你愿意使用 rt.jar 之外的东西,你可以使用消息队列。 ActiveMQ 和 RabbitMQ 很流行,它们都支持发布订阅。


      编辑:侦听器模式的简要说明

      拥有一个 ListenerManager 消费者,而不是多个消费者。它从队列中拉出一个对象,然后将其传递给之前已向 ListenerManager 注册的所有 Listener。最后,ListenerManager 处理对象。每个队列有一个 ListenerManager,每个事件/对象类型有一个队列。这样便于管理。

      【讨论】:

      • 2.这种方式需要在剩下的1个消费者完成时; 3.您能详细介绍一下听众吗?
      【解决方案3】:

      您可以对多个消费者使用破坏者。 请关注link。您可能必须指定消费者之间的依赖关系。 请使用此example 代码我试图将两个处理程序与一个队列连接

      【讨论】:

      【解决方案4】:

      是否有任何理由说明将 n 个对项目 A 的引用而不是一个仅放入队列的简单解决方案行不通?如果您有多个生产者,则必须同步他们的访问权限,但如果 a 在 b 之前完成很重要,那么您无论如何都需要这样做。

      这实际上至少与使用额外的类来处理这个问题一样有效 - 类的实例至少增加了 2 个单词的开销,而提议的实例只添加了 2 个引用(可以小于 2 个单词)。

      【讨论】:

      • 我不明白“将 n 个对项目 A 的引用放入队列”?请稍微解释一下。而且我只有一个适合这种情况的产品。
      【解决方案5】:

      您需要做的是让一个线程监听队列,然后将项目传播给消费者。

      // listener thread
      Element element;
      while ((element = queue.take()) != null) {
        for (final Listener listener : myListeners) {
          listener.getQueue().put(element);
        }
      }
      

      基本上是生产者模式与观察者模式的结合。

      【讨论】:

      • 和 Paul Hicks 描述的一样
      • 在第 3 点中,是的,但他建议使用外部库,所以我想指出,这也可以通过大约 3 行代码使用纯 Java 轻松完成。
      【解决方案6】:

      为每个消费者使用一个单独的队列,并让生产者将其添加到所有消费者中。这里没有真正的缺点。

      不清楚是否需要所有个消费者在他们中的任何一个移动到 B 之前已经消费了 A,在这种情况下你必须进行调整。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多