【问题标题】:Need a queue that can support multiple readers需要一个可以支持多个阅读器的队列
【发布时间】:2010-11-28 10:05:52
【问题描述】:

我需要一个可以被多个阅读器处理的队列。

读取器将元素出列并将其发送到 REST 服务。

需要注意的是:

  • 每个阅读器都应该使不同的元素出列。如果队列有元素 A、B 和 C,线程 1 应该以并发的方式使 A 出队,线程 2 应该使 B 出队。以此类推,直到队列中没有任何内容。
  • 我知道总是在繁忙的循环中运行,查看队列中的项目是 CPU 密集型的。所以我不确定阻塞队列是否是一个好的选择。

我有什么选择?

【问题讨论】:

    标签: java multithreading concurrency queue


    【解决方案1】:

    从您的问题描述中我不确定线程​​是否需要以严格的循环方式将元素出列。假设这不是限制,您可以使用BlockingQueuetake() 方法,这将导致线程阻塞直到数据可用(因此不消耗CPU 周期)。

    还要注意take() 实现是原子的(例如LinkedBlockingQueue):如果多个线程在take() 上被阻塞并且单个元素被排队,那么只有一个 线程的 take() 调用将返回;另一个将保持被阻止。

    【讨论】:

    • 不,不需要循环方式。我什至可能会将阅读器线程数增加到 3 或 4。听起来 LinkedBlockingQueue 很适合我。谢谢。
    【解决方案2】:

    ConcurrentLinkedQueueLinkedBlockingQueue 是立即想到的两个选项,具体取决于您是否想要阻止行为。

    正如 Adamski 所说,LinkedBlockingQueuetake() 方法在等待数据到达时不会不必要地消耗 CPU 周期。

    【讨论】:

    • 其实我有点不清楚哪个队列实现更合适:LinkedBlockingQueue 或 ConcurrentLinkedQueue - 我总是出于习惯使用 LinkedBlockingQueue。有人推荐吗?
    • ConcurrentLinkedQueue 没有任何阻塞,因此很可能不适合您的用例。标准的生产者/消费者集合是一个 BlockingQueue。 LinkedBlockingQueue 是一个不错的默认选择。
    • 同意 james - LinkedBlockingQueue 使用 take() 可能是这种情况下的合适解决方案。
    【解决方案3】:

    ConcurrentLinkedQueue 和 LinkedBLockingQueue 的主要区别在于它的吞吐量。在适度的线程争用下,ConcurrentLinkedQueue 大大优于所有其他 BlockingQueues。然而,在竞争激烈的情况下,BlockingQueue 是一个更好的选择,因为它会适当地将竞争线程放入等待线程集中。

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2010-09-17
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多