本文主要研究一下leaky bucket算法的实现
public class LeakyBucket {
private final long capacity;
private final long leaksIntervalInMillis;
private double used;
private long lastLeakTimestamp;
public LeakyBucket(long capacity, long leaksIntervalInMillis) {
this.capacity = capacity;
this.leaksIntervalInMillis = leaksIntervalInMillis;
this.used = 0;
this.lastLeakTimestamp = System.currentTimeMillis();
}
synchronized public boolean tryConsume(int drop) {
leak();
if (used + drop > capacity) {
return false;
}
used = used + drop;
return true;
}
private void leak() {
long currentTimeMillis = System.currentTimeMillis();
if (currentTimeMillis > lastLeakTimestamp) {
long millisSinceLastLeak = currentTimeMillis - lastLeakTimestamp;
long leaks = millisSinceLastLeak / leaksIntervalInMillis;
if(leaks > 0){
if(used <= leaks){
used = 0;
}else{
used -= (int)leaks;
}
this.lastLeakTimestamp = currentTimeMillis;
}
}
}
}