Class TokenBucket

java.lang.Object
com.xxl.tool.concurrent.TokenBucket

public abstract class TokenBucket extends Object
token bucket (optimized based on guava, remove unnecessary locks, improve performance in boundary cases)
Author:
xuxueli 2025-09-05
  • Field Details

    • storedPermits

      protected double storedPermits
    • maxPermits

      protected double maxPermits
    • stableIntervalMicros

      protected double stableIntervalMicros
    • permitsPerSecond

      protected double permitsPerSecond
  • Constructor Details

    • TokenBucket

      public TokenBucket()
  • Method Details

    • create

      public static TokenBucket create(double permitsPerSecond)
      create TokenBucket with smoothBursty
      Parameters:
      permitsPerSecond - 每秒许可数
      Returns:
      TokenBucket
    • create

      public static TokenBucket create(double permitsPerSecond, Duration warmupPeriod)
      create TokenBucket with smooth-warming-up
      Parameters:
      permitsPerSecond - 每秒许可数
      warmupPeriod - 预热周期
      Returns:
      TokenBucket
    • create

      public static TokenBucket create(double permitsPerSecond, long warmupPeriod, TimeUnit unit)
      create TokenBucket with smooth-warming-up
      Parameters:
      permitsPerSecond - 每秒许可数
      warmupPeriod - 预热周期
      unit - 预热周期单位
      Returns:
      TokenBucket
    • create

      public static TokenBucket create(double permitsPerSecond, long warmupPeriod, TimeUnit unit, double coldFactor)
      create TokenBucket with smooth-warming-up
      Parameters:
      permitsPerSecond - 每秒许可数
      warmupPeriod - 预热周期
      unit - 预热周期单位
      coldFactor - 冷却因子,默认3.0,值越大冷却越慢;冷却时间 = 冷却因子 * 稳定间隔时间
      Returns:
      TokenBucket
    • setRate

      public final void setRate(double permitsPerSecond)
      设置令牌桶的速率
      Parameters:
      permitsPerSecond - 每秒许可数
    • acquire

      public double acquire()
      阻塞获取令牌
      Returns:
      等待时间,单位为秒
    • acquire

      public double acquire(int permits)
      阻塞获取令牌
      Parameters:
      permits - 请求的许可数
      Returns:
      等待时间,单位为秒
    • tryAcquire

      public boolean tryAcquire()
      尝试获取令牌
      Returns:
      是否获取到令牌
    • tryAcquire

      public boolean tryAcquire(Duration timeout)
      尝试获取令牌
      Parameters:
      timeout - 超时时间
      Returns:
      是否获取到令牌
    • tryAcquire

      public boolean tryAcquire(long timeout, TimeUnit unit)
      尝试获取令牌
      Parameters:
      timeout - 超时时间
      unit - 超时时间的单位
      Returns:
      是否获取到令牌
    • tryAcquire

      public boolean tryAcquire(int permits)
      尝试获取令牌
      Parameters:
      permits - 请求的许可数
      Returns:
      是否获取到令牌
    • tryAcquire

      public boolean tryAcquire(int permits, Duration timeout)
      尝试获取令牌
      Parameters:
      permits - 请求的许可数
      timeout - 超时时间
      Returns:
      是否获取到令牌
    • tryAcquire

      public boolean tryAcquire(int permits, long timeout, TimeUnit unit)
      尝试获取令牌
      Parameters:
      permits - 请求的许可数
      timeout - 超时时间
      unit - 超时时间的单位
      Returns:
      是否获取到令牌
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • toNanosSaturated

      public static long toNanosSaturated(Duration duration)
      将Duration对象转换为纳秒值,并处理可能的溢出情况
    • formatCompact4Digits

      public static String formatCompact4Digits(double value)
      使用通用科学计数法,保留4位有效数字
    • sleepUninterruptibly

      public static void sleepUninterruptibly(long sleepFor, TimeUnit unit)
      休眠指定时间,不响应中断
    • saturatedAdd

      public static long saturatedAdd(long a, long b)
      饱和加法