使用java实现令牌桶算法
时间: 2023-10-12 13:18:37 浏览: 95
令牌桶Java实现
5星 · 资源好评率100%
下面是使用Java实现令牌桶算法的示例代码:
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TokenBucket {
private final int capacity;
private int tokens;
private final int rate;
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public TokenBucket(int capacity, int rate) {
this.capacity = capacity;
this.tokens = capacity;
this.rate = rate;
scheduleTokens();
}
public synchronized boolean getToken() {
if (tokens > 0) {
tokens--;
return true;
} else {
return false;
}
}
private void scheduleTokens() {
scheduler.scheduleAtFixedRate(() -> {
synchronized (this) {
if (tokens < capacity) {
tokens++;
}
}
}, 0, 1000 / rate, TimeUnit.MILLISECONDS);
}
public static void main(String[] args) {
TokenBucket bucket = new TokenBucket(10, 5); // 10 tokens capacity, 5 tokens per second
for (int i = 0; i < 20; i++) {
if (bucket.getToken()) {
System.out.println("Request " + i + " is processed.");
} else {
System.out.println("Request " + i + " is rejected.");
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
这个实现中,令牌桶的容量和速率都是可以配置的。在构造函数中,我们初始化了令牌桶的容量和剩余令牌数量,并调用了 `scheduleTokens()` 方法来定时增加令牌。在 `getToken()` 方法中,我们使用 synchronized 关键字来保证线程安全,当令牌桶中有令牌时,就消耗一个令牌并返回 true,否则返回 false 表示请求被拒绝。在 main 方法中,我们模拟了 20 个请求,每个请求间隔 200 毫秒,然后尝试从令牌桶中获取令牌,如果获取成功就输出请求被处理的信息,否则输出请求被拒绝的信息。
阅读全文