生成令牌桶算法java代码
时间: 2023-10-22 11:21:25 浏览: 48
下面是一个简单的令牌桶算法的Java代码实现:
```java
import java.util.concurrent.TimeUnit;
public class TokenBucket {
private final int maxTokens;
private long lastRefillTime;
private int tokens;
public TokenBucket(int maxTokens) {
this.maxTokens = maxTokens;
this.lastRefillTime = System.currentTimeMillis();
this.tokens = maxTokens;
}
public synchronized void refill() {
long currentTime = System.currentTimeMillis();
long elapsedTime = currentTime - lastRefillTime;
int newTokens = (int) (elapsedTime * maxTokens / TimeUnit.SECONDS.toMillis(1));
tokens = Math.min(tokens + newTokens, maxTokens);
lastRefillTime = currentTime;
}
public synchronized boolean tryConsume() {
refill();
if (tokens > 0) {
tokens--;
return true;
} else {
return false;
}
}
}
```
这里,我们使用了Java的`synchronized`关键字来保证线程安全。`TokenBucket`类的构造函数需要传入最大令牌数`maxTokens`,并且在构造函数中初始化了当前令牌数`tokens`为最大令牌数。
`refill()`方法会在每次调用`tryConsume()`方法时自动调用,它会计算从上次调用`refill()`方法到现在的时间间隔,然后根据时间间隔和最大令牌数计算新的令牌数。如果新的令牌数超过了最大令牌数,就将当前令牌数设为最大令牌数。
`tryConsume()`方法会先调用`refill()`方法进行令牌刷新,然后判断当前令牌数是否大于0,如果是,就将当前令牌数减1并返回`true`,否则返回`false`表示令牌桶中没有令牌了。