【问题标题】:disruptor one event handler stalls other event handlers破坏者一个事件处理程序停止其他事件处理程序
【发布时间】:2015-07-30 13:06:51
【问题描述】:

我正在使用以下事件处理程序运行中断实例:

int NUM_EVENT_PROCESSORS = 5;

executor = Executors.newFixedThreadPool(NUM_EVENT_PROCESSORS);

EventFactory factory = new EventFactory();

System.out.println("Starting Disruptor");

disruptor = new Disruptor<>(factory, RING_SIZE, executor, ProducerType.SINGLE, new BlockingWaitStrategy());
disruptor.handleEventsWith(new Logger(), new Replicator(), new Logic());
disruptor.start();

我发现了一个实例,其中 Replicator() 线程挂起并阻塞了 Logic() 线程。

如果 ringbuffer 中有 1 个事件,中断线程是否按顺序工作?

【问题讨论】:

  • 你在构建 Disruptor 实例时使用了什么样的执行器?
  • @Sam Turtel Barker int NUM_EVENT_PROCESSORS = 5; executor = Executors.newFixedThreadPool(NUM_EVENT_PROCESSORS); EventFactory factory = new EventFactory(); System.out.println("Starting Disruptor"); disruptor = new Disruptor&lt;&gt;(factory, RING_SIZE, executor, ProducerType.SINGLE, new BlockingWaitStrategy());

标签: java disruptor-pattern lmax


【解决方案1】:

每个 EventHandler 都在独立于其他消费者线程的“消费者”线程中运行。唯一可能影响(减慢)其他消费者线程的时间是当一个消费者太慢以至于 RingBuffer 变得导致生产者被阻塞,进而影响消费者。 Code for consumer thread(i.e code running EventHandler)

【讨论】:

    【解决方案2】:

    好的,这是我自己的错误。我运行了 2 组干扰器(一组用于客户端,一组用于提供方),我的客户端代码如下:

    disruptor.handleEventsWith(new Logger(), new Replicator()).then(new Logic());
    

    而我的提供商端代码如下:

    disruptor.handleEventsWith(new Logger(), new Replicator(), new Logic());
    

    所以客户端的中断实例正在按照它的指示进行操作。如果复制器阻塞,逻辑线程也会阻塞。

    感谢堆栈溢出让我再次检查我的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多