类 SingleConsumerBarrier

java.lang.Object
cn.wjybxx.disruptor.SingleConsumerBarrier
所有已实现的接口:
ConsumerBarrier, SequenceBarrier

public class SingleConsumerBarrier extends Object implements ConsumerBarrier
单线程消费者屏障
作者:
wjybxx date - 2024/1/18
  • 构造器详细资料

    • SingleConsumerBarrier

      public SingleConsumerBarrier(ProducerBarrier producerBarrier, WaitStrategy waitStrategy, SequenceBarrier... dependentBarriers)
      参数:
      producerBarrier - 序号生成器
      waitStrategy - 该组消费者的等待策略
      dependentBarriers - 依赖的屏障
  • 方法详细资料

    • waitFor

      public long waitFor(long sequence) throws TimeoutException, AlertException, InterruptedException
      从接口复制的说明: ConsumerBarrier
      等待给定的序号可消费

      警告:多生产者模式下该操作十分消耗性能,如果在waitFor获取sequence之后不完全消费, 而是每次消费一点,再拉取一点,则会在该操作上形成巨大的开销 —— 极端情况是每次拉取1个,性能将差到极致。 建议的的方式:先拉取到本地,然后在本地分批处理,避免频繁调用waitFor

      指定者:
      waitFor 在接口中 ConsumerBarrier
      参数:
      sequence - 等待消费的序号
      返回:
      当前可用的最大序号
      抛出:
      TimeoutException - if a timeout occurs while waiting for the supplied sequence.
      AlertException - if a status change has occurred for the Disruptor
      InterruptedException - if the thread needs awaking on a condition variable.
    • isAlerted

      public boolean isAlerted()
      从接口复制的说明: ConsumerBarrier
      【当前屏障】是否收到了特殊信号
      指定者:
      isAlerted 在接口中 ConsumerBarrier
      返回:
      如果收到了终止信号,则返回true,否则返回false
    • alert

      public void alert()
      从接口复制的说明: ConsumerBarrier
      通知屏障关联的生产者/消费者状态产生变化,该信号将保留至被清理 -- ConsumerBarrier.clearAlert()。 1. 该信号的作用类似于线程的中断信号,通常用于停止线程。 2. 用于其它目的时请慎重。
      指定者:
      alert 在接口中 ConsumerBarrier
    • clearAlert

      public void clearAlert()
      从接口复制的说明: ConsumerBarrier
      清除【屏障】的alert状态。
      指定者:
      clearAlert 在接口中 ConsumerBarrier
    • checkAlert

      public void checkAlert() throws AlertException
      从接口复制的说明: ConsumerBarrier
      检查【屏障】的的alert状态,如果收到信号,则抛出AlertException
      指定者:
      checkAlert 在接口中 ConsumerBarrier
      抛出:
      AlertException - if alert has been raised.
    • claim

      @Deprecated public void claim(long sequence)
      已过时。
      从接口复制的说明: SequenceBarrier
      设置当前屏障的序号。 1. 仅在初始化屏障时使用。 2. 这是个很危险的方法,避免在运行中使用,否则可能导致错误。 3. 屏障的初始值为SequenceBarrier.INITIAL_SEQUENCE
      指定者:
      claim 在接口中 SequenceBarrier
      参数:
      sequence - 要初始化的值
    • memberSequence

      public Sequence memberSequence(int index)
      从接口复制的说明: ConsumerBarrier
      获取消费者成员的sequence (反转依赖)
      指定者:
      memberSequence 在接口中 ConsumerBarrier
      参数:
      index - 消费者索引
    • groupSequence

      public Sequence groupSequence()
      从接口复制的说明: SequenceBarrier
      获取生产者组/消费者组用的Sequence。 1. 生产者/消费者通过更新该Sequence更新屏障的进度。 2. 如果当前屏障是一个视图对象,而不是真正用于工作的屏障,该方法应当抛出异常,而不是创建一个虚假的Sequence
      指定者:
      groupSequence 在接口中 SequenceBarrier
    • sequence

      public long sequence()
      从接口复制的说明: SequenceBarrier
      当前Barrier关联的【生产或消费】进度。 上游需要感知当前Barrier的消费进度 -- 计算它的SequenceBarrier.dependentSequence()
      指定者:
      sequence 在接口中 SequenceBarrier
      返回:
      进度
    • dependentSequence

      public long dependentSequence()
      从接口复制的说明: SequenceBarrier
      获取当前屏障【依赖的生产者或消费者】的序号。

      生产者

      1.对生产者而言,这是下一个可写数据的序号。 2.可能没有消费者,因此生产者可能没有依赖。

      消费者

      1.对消费者而言:这是下一个可消费数据的序号。 2.消费者可依赖生产者和其它消费者,该序号为所有依赖的最小序号。 3.依赖其它消费者时,依赖的是其已消费的序号 -- 确保可见性。
      指定者:
      dependentSequence 在接口中 SequenceBarrier
      返回:
      所有依赖的最小序号;没有依赖的情况下返回Long.MAX_VALUE
    • minimumSequence

      public long minimumSequence()
      从接口复制的说明: SequenceBarrier
      指定者:
      minimumSequence 在接口中 SequenceBarrier
    • addDependentBarriers

      public void addDependentBarriers(SequenceBarrier... barriersToTrack)
      从接口复制的说明: SequenceBarrier
      添加当前屏障需要追踪的屏障。 当前屏障关联的生产者或消费者会持续最终他们的进度,以保证数据生产或消费的正确性。

      ps:生产者的要追踪屏障通常是动态的,消费者要追踪的屏障通常在构造时指定。

      指定者:
      addDependentBarriers 在接口中 SequenceBarrier
      参数:
      barriersToTrack - 要追踪的屏障
    • removeDependentBarrier

      public boolean removeDependentBarrier(SequenceBarrier barrier)
      从接口复制的说明: SequenceBarrier
      移除这些屏障,不再跟踪它们的进度信息; 特殊用法:如果移除了所有的消费者,那么生产者便不会被阻塞,也就能ProducerBarrier.next() 死循环中醒来!
      指定者:
      removeDependentBarrier 在接口中 SequenceBarrier
      参数:
      barrier - 要删除的屏障
      返回:
      如果给定barrier存在且删除成功则返回true,否则返回false。