如何用java实现令牌桶
时间: 2024-01-23 14:02:39 浏览: 30
以下是Java实现令牌桶算法的一个简单示例:
```java
public class TokenBucket {
private int capacity; // 令牌桶的容量
private int tokens; // 当前令牌数量
private long lastRefillTime; // 上次令牌填充时间
private double refillRate; // 令牌填充速率
// 构造函数,传入令牌桶的容量和令牌填充速率
public TokenBucket(int capacity, double refillRate) {
this.capacity = capacity;
this.tokens = capacity;
this.refillRate = refillRate;
this.lastRefillTime = System.currentTimeMillis();
}
// 尝试获取令牌,若获取成功返回 true;否则返回 false
public synchronized boolean tryConsume() {
refill(); // 先填充令牌桶
if (tokens > 0) { // 若令牌桶中有令牌,则取走一个
tokens--;
return true;
} else { // 否则取走失败
return false;
}
}
// 填充令牌桶
private void refill() {
long now = System.currentTimeMillis();
double tokensToAdd = (now - lastRefillTime) / 1000.0 * refillRate; // 计算需要填充的令牌数量
tokens = Math.min(capacity, (int) (tokens + tokensToAdd)); // 填充令牌桶
lastRefillTime = now;
}
}
```
在这个实现中,我们使用了Java的`synchronized`关键字来确保线程安全。每次调用`tryConsume()`方法时,会先调用`refill()`方法填充令牌桶,然后尝试取走一个令牌。在`refill()`方法中,我们通过计算两次填充时间的时间差和令牌填充速率,来计算需要填充的令牌数量,最后填充令牌桶。