如何手写一个令牌桶算法
要实现流量的控制,必须有一种机制可以对通过设备的流量进行度量。令牌桶(Token-Bucket)是目前最常采用的一种流量测量方法,用来评估流量速率是否超过了规定值。这里的令牌桶是指网络设备的内部存储池,而令牌则是指以给定速率填充令牌桶的虚拟信息包。
令牌桶可以看作是一个存放令牌的容器,预先设定一定的容量。系统按设定的速度向桶中放置令牌,当桶中令牌满时,多余的令牌溢出。令牌桶只是一种流量测量方法,并不能对流量进行过滤或采取某种措施,比如说丢弃数据包等,这些操作由其他功能完成,而且令牌桶中装的是令牌而不是报文分组。
var foo = 'bar';
class Token{
private int limit;
private int period;
private ArrayBlockingQueue<String> blockingQueue;
private TimeUnit timeUnit;
public Token(int limit, int period, TimeUnit timeUnit){
this.limit = limit;
this.timeUnit = timeUnit;
this.period = period;
this.blockingQueue = new ArrayBlockingQueue<>(limit);
init();
start();
}
public void init(){
for(int i = 0;i < limit;i++){
blockingQueue.offer("token");
}
}
public boolean tryAcquire(){
return blockingQueue.poll() != null;
}
public void addToken(){
blockingQueue.add("1");
}
public void start(){
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(()->{
addToken();
},10,period,timeUnit);
}
}