我做了很多研究,但还找不到解决方案。我想找到一个pollable ring buffer
,类似于LMAX disruptor
。我有很多出版商和一位读者。
disrupto
r的问题在于它使用自己的专用线程(池)来读取消息,但是我想从单独的线程中读取消息,这也可以做其他事情。
我看到的一种替代方法是使用ManyToOneConcurrentArrayQueue
中的agrona
或MpscArrayQueue
中的jctools
。但是,这两个队列preallocates
都没有LMAX disruptor
那样的对象。当我调用ManyToOneConcurrentArrayQueue::offer
或MpscArrayQueue::offer
时,我将对象的所有权转移到队列中,当我调用ManyToOneConcurrentArrayQueue::poll
或MpscArrayQueue::poll
时,我从它们中获取了所有权。这是一个问题,因为它迫使我有一个单独的对象池来回收这些对象,以避免产生垃圾。显然比拥有preallocated array
始终拥有其内容的所有权(LMAX干扰程序包中的la RingBuffer)要慢。
我不想自己重新发明轮子并建立这样的数据结构,但是我也找不到现有的数据结构。如果有人已经遇到过这样的结构,我将不胜感激。
答案 0 :(得分:2)
disruptor 库包含一个 EventPoller 类
答案 1 :(得分:1)
可以直接使用LMAX干扰器RingBuffer实现。
潜在地利用项目的其他部分,而无需整体上启动 disruptor 。