java - 并发合并队列和监听器

标签 java multithreading queue

我有一个从外部源接收事件的EventsManager事件具有类型

监听器可以注册到EventsManager来获知特定类型事件的连续值。

对于给定类型的事件,EventsManager promise 两件事:

  • 相同的值不会连续发送两次(当监听器收到通知时,可以保证收到的值与上一次通知的值不同)。
  • 对于给定类型的事件,必须保留从外部源接收值的顺序。

我有一个可用的同步版本,但我想提高吞吐量。

典型用途:< 1k 个监听器、< 10k 事件类型、< 每秒接收的 1M 事件(但大多数被丢弃,因为没有为该类型的事件注册监听器或值未更改)。

  • 实现该行为的最有效策略是什么(例如,我可以为每个事件类型使用一个队列/锁并将它们保存在 ConcurrentMap 中,但拥有 10k 队列听起来不是一个好主意)?
  • 是否有任何现有库可以使用可扩展的并发结构执行类似的操作?

示例:监听器 lst1 想要监听 type1 类型的事件
EventsManager 接收:

event: type2, value: 2
event: type1, value: 1
event: type1, value: 1 //no change => discard
event: type3, value: 4
event: type1, value: 7

lst1 应该按顺序接收:1(仅一次),然后是 7

最佳答案

我会尝试实现这个事件流

  1. 所有传入事件都会放入初始 EventQueue
  2. EventDispatcherThread 读取 EventQueue,并针对每种类型过滤并路由事件到适当的EventQueue(队列的简单映射)<
  3. EventListernerThread 的多个实例正在读取其类型的相应 EventQueue...

无需锁定/同步

关于java - 并发合并队列和监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878585/

相关文章:

ruby - popen 内的超时有效,但超时内的 popen 无效?

c - 分配 :what can "corrupt" allocated memory in Linux/Qt application (threads involved)?

c++ - 在C++中退出具有三个线程的两个并发队列

java - Eclipse Java EE 新 Maven 项目 : Could not resolve archetype

java - 如何使用 jython 从 pyservlet 的 url 中删除 .py

java - Hibernate @Transactionl 错误

c# - 如何在 C# 中对项目列表进行排队?

java - 为什么找不到 "com.lowagie.text.rtf"?

Java 多线程 HTTP

无锁队列的C代码