如何创建我们可以阻塞的Java并发队列 - 在单个调用中占用多个元素?

时间:2014-03-19 13:01:20

标签: java concurrency websocket queue producer-consumer

背景:我需要以异步方式向WebSocket客户端发送许多小尺寸消息。消息通常以峰值发送,因此在暂停后我需要快速发送~5000条消息。所以问题是:

  • 我不想在单线程中启动5000异步
  • 我不想循环“启动异步” - “等待完成”5000次连续
  • 我不想使用5000个线程,每个线程使用单个“start async” - “等待完成”

最好的方法是每个线程分组~20个asyncs,所以我需要非常具体的队列

  • 很多表示队列中的并发推送/轮询
  • 小型异步表示我想在捆绑中轮询,例如每个队列1到20条消息take() (所以我可以开始1 ... 20个异步I / O并等待单线程中的完整性)
  • 立即意味着我不想等到20个消息被轮询,只有队列有大量消息时才应该使用bundle-poll。应立即轮询并发送单条消息。

所以基本上:我需要像队列这样的结构,在单个阻塞调用中有阻塞(1到X)等待元素。伪代码:

[each of ~50 processing threads]:
messages = queue.blockingTake( max 10 or at least 1 if less than 10 available );
for each message: message.startAsync()
for each message: message.waitToComplete()
repeat

1 个答案:

答案 0 :(得分:0)

如果没有必要,我不会从头开始实施队列。如果您有兴趣,请提供一些想法:

队列>如果您只有1个主题提供优惠。如果你有更多,那么这个系列必须是同步的。比如,一个提交者peek() - s进入队列,看到最后一个集合有太多元素,所以它创建一个新元素并提供它。

许多正在运行的线程,其中runnables从队列中逐个获取元素。

每个发送线程1个队列,如果保留队列引用,则可以循环方式为每个队列添加元素。

将您选择的BlockingQueue子类化并创建一个" Collection take(int i)"使用正常take()的重写版本的方法。