【问题标题】:android/java - looking for an efficient concurrent cyclic queue [closed]android/java - 寻找一个高效的并发循环队列[关闭]
【发布时间】:2012-05-19 00:46:34
【问题描述】:

有谁知道有界并发循环队列的(开源)实现,或内置于 android/java 中的可用 API 类?

这个集合我需要的并发(非同步或基于锁)操作至少是 enqueue 和 dequeue ,但 enqueue 也足够了。

对于那些不确定我需要的收藏的人,这里有更多信息:

  • bounded - 有最大数量的项目可以在里面。
  • 并发 - 允许多个线程高效运行操作而无需任何类型的锁定。这与同步解决方案相反,它只允许单个线程运行操作。
  • 循环 - 如果我们将项目放入已填充的集合中,新项目将替换最旧的项目。

请帮忙

【问题讨论】:

  • 听起来你应该只复制ArrayBlockingQueue.java(它在框架源代码中可用)并更改#offer(T)#put(T)方法以使最后一个项目出列 - 和presto - 即时有界队列驱逐最后一项。
  • @Jens - ArrayBlockingQueue 不允许多线程并发访问,从来源来看。
  • 正确。不仅如此,而且它也不是循环的:如果您尝试将一个项目放入已填充的队列中,它将等待它直到它没有被填充,反之亦然 - 如果你试图从一个空队列中获取一个项目,它会一直等待它直到它不为空。
  • ArrayBlockingQueue #offer(T) 是非阻塞的,就像 #poll() - 阻塞版本分别是 #put(T)#take() - 所以 是的,它们被使用了当您需要并发的非阻塞轮询和报价时.. @androiddeveloper:是的,这就是为什么您必须复制和修改源以在队列已满时出列。
  • “并发 - 允许多个线程在没有任何锁定的情况下高效地运行操作”——根据定义,这是不可能的。

标签: java android queue cyclic


【解决方案1】:

你描述的听起来很像disruptor,但它是一个外部库,不是内置的。据我所知,Java标准库中没有内置的环形缓冲区数据结构。

【讨论】:

  • 正确。它看起来确实相似。你认为这正是我需要的吗?他们有使用示例代码吗?如果是这样,我会给你一个V。 :)
  • technical description document [PDF] 和 in the wiki 的第 4.7 点有一个代码示例。破坏者是否正是您所需要的,只有您自己知道:)
  • 示例代码看起来与真正的队列并不相似。另外,我不确定 BatchHandler、batchConsumer、ConsumerBarrier 和 ProducerBarrier 的用途是什么。请展示一些实现使用该库的入队和出队方法的代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2012-10-30
  • 2012-07-31
相关资源
最近更新 更多