Package com.xxl.tool.concurrent
Class TokenBucket
java.lang.Object
com.xxl.tool.concurrent.TokenBucket
token bucket
(optimized based on guava, remove unnecessary locks, improve performance in boundary cases)
- Author:
- xuxueli 2025-09-05
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected doubleprotected doubleprotected doubleprotected double -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptiondoubleacquire()阻塞获取令牌doubleacquire(int permits) 阻塞获取令牌static TokenBucketcreate(double permitsPerSecond) create TokenBucket with smoothBurstystatic TokenBucketcreate TokenBucket with smooth-warming-upstatic TokenBucketcreate TokenBucket with smooth-warming-upstatic TokenBucketcreate TokenBucket with smooth-warming-upstatic StringformatCompact4Digits(double value) 使用通用科学计数法,保留4位有效数字static longsaturatedAdd(long a, long b) 饱和加法final voidsetRate(double permitsPerSecond) 设置令牌桶的速率static voidsleepUninterruptibly(long sleepFor, TimeUnit unit) 休眠指定时间,不响应中断static longtoNanosSaturated(Duration duration) 将Duration对象转换为纳秒值,并处理可能的溢出情况toString()boolean尝试获取令牌booleantryAcquire(int permits) 尝试获取令牌booleantryAcquire(int permits, long timeout, TimeUnit unit) 尝试获取令牌booleantryAcquire(int permits, Duration timeout) 尝试获取令牌booleantryAcquire(long timeout, TimeUnit unit) 尝试获取令牌booleantryAcquire(Duration timeout) 尝试获取令牌
-
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
create TokenBucket with smoothBursty- Parameters:
permitsPerSecond- 每秒许可数- Returns:
- TokenBucket
-
create
create TokenBucket with smooth-warming-up- Parameters:
permitsPerSecond- 每秒许可数warmupPeriod- 预热周期- Returns:
- TokenBucket
-
create
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
尝试获取令牌- Parameters:
timeout- 超时时间- Returns:
- 是否获取到令牌
-
tryAcquire
尝试获取令牌- Parameters:
timeout- 超时时间unit- 超时时间的单位- Returns:
- 是否获取到令牌
-
tryAcquire
public boolean tryAcquire(int permits) 尝试获取令牌- Parameters:
permits- 请求的许可数- Returns:
- 是否获取到令牌
-
tryAcquire
尝试获取令牌- Parameters:
permits- 请求的许可数timeout- 超时时间- Returns:
- 是否获取到令牌
-
tryAcquire
尝试获取令牌- Parameters:
permits- 请求的许可数timeout- 超时时间unit- 超时时间的单位- Returns:
- 是否获取到令牌
-
toString
-
toNanosSaturated
将Duration对象转换为纳秒值,并处理可能的溢出情况 -
formatCompact4Digits
使用通用科学计数法,保留4位有效数字 -
sleepUninterruptibly
休眠指定时间,不响应中断 -
saturatedAdd
public static long saturatedAdd(long a, long b) 饱和加法
-