有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java并发合并队列和侦听器

我有一个EventsManager从外部源接收事件。一个Event有一个type和一个value

监听器可以注册到EventsManager,以了解特定类型事件的后续值

对于给定类型的事件,EventsManager承诺了两件事:

  • 同一个值不会在一行中发送两次(当侦听器收到通知时,可以保证他们收到的值与之前的通知不同)
  • 对于给定类型的事件,必须保留从外部源接收值的顺序

我有一个工作synchronized版本,但我想提高吞吐量

典型用法:<;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) 个答案

  1. # 1 楼答案

    我会尝试实现这个事件流

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

    无需锁定/同步