繁体   English   中英

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

[英]How to create Java concurrent queue from which we can blocking-take more than 1 element in single call?

背景:我需要以异步方式向WebSocket客户端发送许多小型消息。 消息通常以高峰发送,因此经过一些暂停后,我需要快速发送约5000条消息。 所以问题是:

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

最好的方法是将每个线程约20个异步组,因此我需要非常具体的队列

  • 大量意味着同时在队列中进行推/轮询
  • 小型异步意味着我想按捆绑方式轮询,例如每个队列有1到20条消息take() (因此我可以启动1 ... 20异步I / O并等待单线程完成)
  • 立即意味着我不想等到将轮询20条消息时,仅当队列中有很多消息时才应使用bundle-poll。 单个消息应被轮询并立即发送。

所以基本上: 我需要像队列这样的结构,它在单个阻塞调用中具有阻塞take(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

如果没有必要,我不会从头开始实施Queue。 有兴趣的一些建议:

队列>,如果您只有1个线程在执行商品。 如果您还有更多内容,则必须同步该集合。 就像一个报价者peek()-s进入队列一样,它看到最后一个集合包含太多元素,因此它创建了一个新集合并提供了它。

要么

许多运行线程,其中可运行对象从队列中一个接一个地获取元素。

要么

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

要么

将您选择的BlockingQueue子类化,并使用重写版的take()创建“ Collection take(int i)”方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM